我有一个包含产品的数据库。当我选择产品时,我想在我的数据库中获得下一个产品。
例如: 我的产品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语句吗?
答案 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
希望有所帮助!