mysql获取多列排序的下一行

时间:2016-01-28 21:07:16

标签: mysql sql database range row

我有一个包含产品的数据库。当我选择产品时,我想在我的数据库中获得下一个产品。

例如: 我的产品ID为188,我希望得到ID为167的下一个产品。

数据库:

SELECT * FROM product ORDER BY title ASC, description ASC
+----+----------------------+----------------------+
| id | title                | description          |
+----+----------------------+----------------------+
|111 | Adjusterhouse        | Finetuning           |
+----+----------------------+----------------------+
|188 | Adjustment housing   | Height               |
+----+----------------------+----------------------+
|167 | Adjustment housing   | Oilpressure          |
+----+----------------------+----------------------+
|105 | Adjustment housing   | Suspension           |
+----+----------------------+----------------------+
|102 | Adjustment nut L+R.  | Packaging machinery  |
+----+----------------------+----------------------+

但如果我使用以下SQL语句,我会得到ID为102而不是167的产品。

SELECT * FROM product 
WHERE title > ? AND (title > ? OR description > ?) 
ORDER BY title ASC, description ASC LIMIT 1

有人可以帮我解决这个SQL语句吗?

3 个答案:

答案 0 :(得分:0)

您使用>对标题进行排序。假设您有记录188,标题为Adjustment housing如果您认为您将设置第一条记录title < 'Adjustment housing'实际上是记录102.

将其更改为:

SELECT * FROM product 
 WHERE title >= ? AND description >= ? AND id != ? 
 ORDER BY title ASC, description ASC, id ASC LIMIT 1

在准备好的参数绑定

中,第二个?被替换为id 188

答案 1 :(得分:0)

你有正确的方法。只需要进行一次小的更改,将第一次比较更改为“大于 或等于 ”,而不只是“大于”。

只要(title,description)元组是唯一的,那就可以了。这是你想要的模式:

WHERE ( title >= ? )
  AND ( title > ? OR description > ? )

(唯一的变化是您需要将title >= “比较作为WHERE中的第一个条件。您拥有的其他所有内容都是细

如果(title,description)元组不能保证唯一...

我们需要在订购中添加额外的列。 id列似乎是理想的候选者。这有点复杂,但模式类似......

WHERE title >= ? 
  AND ( title > ? OR (    ( description >= ? )
                      AND ( description > ? OR id > ? )
                     )
      )

 ORDER BY title ASC, description ASC, id ASC

答案 2 :(得分:0)

您的用例没有明确定义,但实现此目的的一种方法是通过limit子句。

因此,以下查询将返回第一行:

SELECT *
FROM product
ORDER BY title ASC, description ASC LIMIT 0, 1

将返回 118,Adjusterhouse,Finetuning

然后你可以使用:

SELECT *
FROM product
ORDER BY title ASC, description ASC LIMIT 1, 1

返回 111,调整外壳,高度

您需要使用SELECT (COUNT(1) - 1) as max_offset FROM product来了解&#34;偏移&#34;你的数据。最大偏移量始终为行数减1.在样本数据中,最大偏移量为:

SELECT *
FROM product
ORDER BY title ASC, description ASC LIMIT 4, 1

希望有所帮助!