Mysql“操作顺序”问题

时间:2009-08-04 19:25:33

标签: sql mysql select

这是我的情况:我想从数据库WHERE id = $ id中选择所有条目。但我希望结果列在一定的优先级。如果,criteria = $ criteria,那么我希望首先显示这些结果。否则,我只想继续显示其余的行。

我的问题是:这会解决我的问题吗?

SELECT field1 WHERE (criteria=$criteria AND id = $id) OR id=$id  LIMIT 5 

查询首先会查看()吗?如果没有,是否有另一种方法可以做到这一点,而不将其分成两个单独的查询?

谢谢,
迈克尔

3 个答案:

答案 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