【问题标题】:Mysql "order of operations" QuestionMysql“操作顺序”问题
【发布时间】:2009-08-04 19:25:32
【问题描述】:

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

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

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

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

谢谢,
迈克尔

【问题讨论】:

    标签: sql mysql select


    【解决方案1】:
    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:我就是这样做的。奇怪的是,你不能在没有子查询的情况下在 Oracle 中做这种事情,因为 Oracle 的做法(行号)是在 order by 之前应用的。
    • DESC 的位置重要吗?我首先想要标准,从最高 id 到最低 id。应该是 criteria = $criteria, id DESC 吗?
    • @Michael:如果你想要最高的id,请使用ORDER BY criteria = $criteria DESC, id DESC
    • 谢谢,那么criteria = $criteria DESC 中的DESC 与criteria = $criteria 相比有什么作用
    • @Michael:criteria = $criteria DESC 是一个布尔表达式。 TRUE1FALSE0DESC 使 TRUE 值排在第一位。
    【解决方案2】:
    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 排序中的行顺序。

    【讨论】:

      【解决方案3】:

      与原始问题无关,只是为了澄清:运算符 AND 比 OR 具有更高的优先级,因此为什么 a or b and c or d 等于 a or (b and c) or d

      【讨论】:

      • 如果不相关请不要发。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 2018-05-19
      相关资源
      最近更新 更多