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
请注意,我们嵌套了相同的模式;用于 description
和 id
的模式与我们用于 title
和 description
.
的模式相同
外部仍然是相同的模式,但现在它在 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
希望对您有所帮助!
我有一个包含产品的数据库。当我选择一个产品时,我想在我的数据库中获取下一个产品。
例如: 我有 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
请注意,我们嵌套了相同的模式;用于 description
和 id
的模式与我们用于 title
和 description
.
外部仍然是相同的模式,但现在它在 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
希望对您有所帮助!