【问题标题】:mysql query ORDER BY supplied conditionmysql 查询 ORDER BY 提供的条件
【发布时间】:2011-12-06 21:26:39
【问题描述】:
SELECT * FROM newmessage
ORDER BY id <somecondition>

我的情况是这样的:

(5, 3, 2, 1, 4)

即。我想ORDER 根据id 得到结果,就像我上面给定的顺序一样。

【问题讨论】:

  • 您对此有何疑问?我猜是“为什么它不起作用”,对吧?您可能想要添加它。 :) 问题是,SQL 不能以这种方式工作。 ORDER BY 只是告诉数据库要排序的列...而不是排序方法。
  • 你说的太对了——SQL分为五个部分:你想要的列,它们加入分组过滤的方式(在哪里),最后按什么顺序:升序或降序我认为这里缺乏知识。 ..
  • 有一些方法可以定义您自己的排序方法。不完全漂亮,但可以做到:)
  • MySQL ORDER BY IN() 的副本。

标签: php mysql


【解决方案1】:
SELECT * FROM newmessage
    WHERE id IN (5, 3, 2, 1, 4)
    ORDER BY FIELD(id, 5, 3, 2, 1, 4)
UNION
SELECT * FROM newmessage WHERE id NOT IN (5, 3, 2, 1, 4)

【讨论】:

    【解决方案2】:

    您需要在ORDER BY 子句中使用CASE 语句。这有点尴尬,但确实有效:

    SELECT * FROM newmessage m
    ORDER BY CASE WHEN m.someColumn = 5 THEN 1
         WHEN m.someColumn = 3 THEN 2
         WHEN m.someColumn = 2 THEN 3
         WHEN m.someColumn = 1 THEN 4
         WHEN m.someColumn = 4 THEN 5
         ELSE m.someColumn END
    

    编辑:请注意,如果您能够将“索引”或“排序”列添加到NewMessage 表中,那么您应该这样做。虽然我的CASE hack 有效,但它并不漂亮。

    【讨论】:

      【解决方案3】:

      这样做的一种方法是休耕:

      SELECT * FROM table ORDER BY id IN(7, 13, 12) DESC;
      

      它将首先对 id 为 7、12 和 13 的行进行排序,它不会按照您在 IN() 语句中列出的确切顺序进行排序。

      按特定顺序排序的方法如下:

      SELECT * FROM table ORDER BY id = 7 DESC, id = 13 DESC, id = 12 DESC;
      

      这将按照您列出它们的顺序给出行。当然,ASC/DESC 部分在这里仍然适用,我只是假设你首先需要这个 id。这有点麻烦,但我认为没有更优雅的方式来实现这一点。

      【讨论】:

        【解决方案4】:

        听起来您可能想查看 ORDER BY FIELD。

        它允许您为给定字段指定自定义顺序,因此您可以这样使用:

        SELECT someField,priority FROM myTable
        ORDER BY FIELD (priority,'HIGH','MEDIUM','LOW')
        

        这将按该顺序为您提供优先级,而不是像通常那样按字母顺序排列。

        因此,您提供的查询示例可能是:

        ORDER BY FIELD(id,'5','3','2','1','4')
        

        【讨论】:

          【解决方案5】:

          您可以在 MySQL 中使用 FIELD 进行这样的排序:

          SELECT   * 
          FROM     newmessage
          ORDER BY FIELD(id, 5, 3, 2, 1, 4)
          

          然而:

          当表中有更多行时,这可能无法按预期工作,然后是 ORDER 子句中指定的行。因此,如果您只想返回这 5 行,则必须将所有 ID 放入其中或添加过滤器。

          【讨论】:

            猜你喜欢
            • 2012-06-24
            • 1970-01-01
            • 1970-01-01
            • 2012-04-26
            • 2012-12-28
            • 1970-01-01
            • 1970-01-01
            • 2014-06-19
            • 2014-07-09
            相关资源
            最近更新 更多