mysql 获取按多列排序的下一行

mysql get next row ordered by multiple columns

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

例如: 我有 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 声明吗?

您对标题的排序 >。假设您有第 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

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

只要 (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

请注意,我们嵌套了相同的模式;用于 descriptionid 的模式与我们用于 titledescription.

的模式相同

外部仍然是相同的模式,但现在它在 title 而不是普通的 description,我们得到了适用于 (description,id) 元组的条件.

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

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

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

会 return 118,Adjusterhouse,微调.

然后您可以使用:

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

至return 111,调整外壳,高度.

您需要使用 SELECT (COUNT(1) - 1) as max_offset FROM product 来了解 "offset" 您的数据有多远。最大偏移量始终为行数减 1。在您的示例数据中,最大偏移量为:

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

希望对您有所帮助!