这是我的情况:我想从数据库WHERE id = $ id中选择所有条目。但我希望结果列在一定的优先级。如果,criteria = $ criteria,那么我希望首先显示这些结果。否则,我只想继续显示其余的行。
我的问题是:这会解决我的问题吗?
SELECT field1 WHERE (criteria=$criteria AND id = $id) OR id=$id LIMIT 5
查询首先会查看()吗?如果没有,是否有另一种方法可以做到这一点,而不将其分成两个单独的查询?
谢谢,
迈克尔
答案 0 :(得分:5)
SELECT field1
FROM mytable
WHERE id = $id
ORDER BY
criteria = $criteria DESC, id
LIMIT 5
,或者这个:
SELECT *
FROM (
SELECT field1
FROM mytable
WHERE id = $id
AND criteria = $criteria
ORDER BY
id
LIMIT 5
) q
UNION
FROM (
SELECT field1
FROM mytable
WHERE id = $id
ORDER BY
id
LIMIT 5
) q2
ORDER BY
criteria = $criteria DESC, id
LIMIT 5
如果您在(id, criteria)
上有一个索引(按此顺序),后者会更有效。
答案 1 :(得分:0)
SELECT field1
FROM mytable
WHERE id = $id
ORDER BY CASE WHEN criteria = $criteria THEN 0 ELSE 1 END CASE
LIMIT 5;
这将列出符合条件的行,而不是因为零在一个之前。
如果这不能直接起作用 - 如写的那样 - 那么将信息放入子查询中:
SELECT field1
FROM (SELECT field1,
CASE WHEN criteria = $criteria THEN 0 ELSE 1 END CASE AS ordering
FROM mytable
WHERE id = $id
) AS subqry
ORDER BY ordering
LIMIT 5;
通常,还有其他次要标准来确定0对1排序中的行顺序。
答案 2 :(得分:-1)
与原始问题无关,只是为了澄清:运算符AND的优先级高于OR,因此为什么a或b和c或d等于a或(b和c)或d