0

我有这个mysql查询:

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

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

我通过使用 UNION 来做到这一点并且它有效,但它更慢(在我的 mysql 上测试了查询) - 实际上,如果没有重复,它比“OR”查询快,但如果有,则速度慢。

泰!

4

3 回答 3

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)

但它可能仍然会很慢。

于 2012-09-12T12:00:17.150 回答
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
于 2012-09-12T12:05:52.150 回答
0

我认为你可以使用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 排序。

于 2012-09-12T12:05:36.160 回答