我有这个mysql查询:
SELECT * FROM `mytable` WHERE (condition 1) OR (condition 2) OR (condition3)
我可以让这个查询显示条件 1 中的行,然后是条件 2 中的行,最后是条件 3 中的行吗?
我通过使用 UNION 来做到这一点并且它有效,但它更慢(在我的 mysql 上测试了查询) - 实际上,如果没有重复,它比“OR”查询快,但如果有,则速度慢。
泰!
我有这个mysql查询:
SELECT * FROM `mytable` WHERE (condition 1) OR (condition 2) OR (condition3)
我可以让这个查询显示条件 1 中的行,然后是条件 2 中的行,最后是条件 3 中的行吗?
我通过使用 UNION 来做到这一点并且它有效,但它更慢(在我的 mysql 上测试了查询) - 实际上,如果没有重复,它比“OR”查询快,但如果有,则速度慢。
泰!
一种方法是使用UNION ALL
,就像您所做的那样。为避免重复,您可以使用
SELECT * FROM `mytable` WHERE (condition 1)
UNION ALL
SELECT * FROM `mytable` WHERE (condition 2) AND NOT (condition 1)
UNION ALL
SELECT * FROM `mytable` WHERE (condition 3) AND NOT (condition 1 OR condition 2)
但它可能仍然会很慢。
不确定这是否适合您:
SELECT * FROM `mytable` WHERE (condition 1) OR (condition 2) OR (condition3)
ORDER BY CASE WHEN condition=1 THEN 1
CASE WHEN condition=2 THEN 2
CASE WHEN condition=3 THEN 3
END
我认为你可以使用ORDER BY
来实现这一点。试试这个:
SELECT * FROM `mytable` WHERE(条件 1)或(条件 2)或(条件 3) ORDER BY ((条件 1) * 4 + (条件 2) * 2 + 条件 1) DESC;
编辑:事实上,你基本上是在构建一个 3 位数字并用它进行排序。想象一下这个真值表:
C1 | C2 | C3 | 结果 0 | 0 | 0 | 0 0 | 0 | 1 | 1 0 | 1 | 0 | 2 0 | 1 | 1 | 3 1 | 0 | 0 | 4 1 | 0 | 1 | 5 1 | 1 | 0 | 6 1 | 1 | 1 | 7
如果您按result DESC
(从下到上)排序,实际上您首先按 C1 排序,如果为假,则按 C2 排序,如果为假,则按 C3 排序。