我有这个mysql查询:
SELECT * FROM `mytable` WHERE (condition 1) OR (condition 2) OR (condition3)
我可以让这个查询显示条件1中的行,然后是条件2中的行,最后是条件3吗?
我是通过使用UNION来实现这一点的,但是效果较慢(在我的mysql上测试查询) - 实际上如果没有重复项,它比“OR”查询更快,但如果有的话,它会慢一些。
泰!
答案 0 :(得分:1)
一种方法是像你一样使用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)
但它可能仍然会很慢。
答案 1 :(得分:1)
不确定这是否适合您:
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
答案 2 :(得分:0)
我认为您可以使用ORDER BY
来实现这一目标。
试试这个:
SELECT * FROM `mytable` WHERE (condition 1) OR (condition 2) OR (condition3) ORDER BY ((condition 1) * 4 + (condition 2) * 2 + condition 1) DESC;
编辑: 实际上,您基本上构建了一个3位数字并使用它进行排序。 想象一下这个真值表:
C1 | C2 | C3 | Result 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排序。