Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

上下篇按钮的SQL语句与复合逻辑的条件表达式

  假如现在有一张表tb,主键字段是id(唯一的)。那么
#下一篇查询
select * from tb
  where id>当前id #如果有其它条件,这里可以用and
  order by id asc
  limit 1
#上一篇查询
select * from tb
  where id<当前id #如果有其它条件,这里可以用and
  order by id desc
  limit 1
  这是最简单的查询了,下一篇就是“在id比当前id大的记录中id最小的那篇”,上一篇就是“在id比当前id小的记录中id最大的那篇”。
  但是经常,我们的文章或商品列表的排序方式不是id,而是其它非唯一字段。这种情况,我们可以按照SQL本身的排序来走,先是判断非唯一字段,如果相同再判断主键。
  假如上面的tb表还有个price字段(非唯一)。
#下一篇查询
select * from tb
  where (
    #注意运算符优先级
    price>当前price or
    price=当前price and
    id>当前id
  ) #如果有其它条件,可以在这里使用and
  order by
    price asc,
    id asc
  limit 1
#上一篇查询
select * from tb
  where (
    #注意运算符优先级
    price<当前price or
    price=当前price and
    id<当前id
  ) #如果有其它条件,可以在这里使用and
  order by
    price desc,
    id desc
    #注意顺序
  limit 1
  其实这个的原理和第一个是一样的,只不过字段多了个而已。但是这个已经很难用自然语言去描述了。接着我们再加个views字段试试。
#下一篇查询
select * from tb
  where (
    views>当期views or 
    views=当期views and (
      price>当期price or
      price=当期price and
      id>当前id
    )
  ) #如果有其它条件,可以在这里使用and
  order by
    views asc,
    price asc,
    id asc
  limit 1
#上一篇查询 略
  看吧,只不过是多了一层嵌套而已。where后面的逻辑判断语句其实可以换行成条件语句来解读,因为在逻辑学中“a或b”的运算是可以解读为“如果非a则b”的。我们把它还成条件表达式来解读就很容易理解了。比如: //伪代码
IF views>当期views THEN
  RETURN true
ELSE
  IF views=当期views THEN
    IF price>当期price THEN
      RETURN true
    ELSE
      IF price=当期price THEN
        IF id>当期id THEN
          RETURN true
        END IF
      END IF
    END IF
  END IF
END IF
  看到这里,逻辑就可以很清晰了。就算是嵌套再多的排序字段也可以搞定。其实用条件表达式只是整理复合逻辑方法的一种,最好的办法是用数学归纳法把一个逻辑量化思考,这玩意儿很复杂,以后再好好说明。
网名:
3.80.32.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^