Mysql“OR”查询按条件顺序获取行

时间:2012-09-12 11:56:05

标签: mysql

我有这个mysql查询:

SELECT * FROM `mytable` WHERE (condition 1) OR (condition 2) OR (condition3)

我可以让这个查询显示条件1中的行,然后是条件2中的行,最后是条件3吗?

我是通过使用UNION来实现这一点的,但是效果较慢(在我的mysql上测试查询) - 实际上如果没有重复项,它比“OR”查询更快,但如果有的话,它会慢一些。

泰!

3 个答案:

答案 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排序。