【问题标题】:Sort MySQL query by a single match, then normally按单个匹配对 MySQL 查询进行排序,然后通常
【发布时间】:2014-06-04 09:27:54
【问题描述】:

我对 MySQL 查询有点熟悉,但有一件棘手的事情我不知道该怎么做。有没有办法告诉系统“先匹配 X 条件,否则正常排序”。例如,在带有字段(post_id, author_id, timestamp) 的表posts 中,我知道该怎么做...

mysql_query("SELECT * FROM posts ORDER BY timestamp");

但是有没有办法让某个用户的帖子(比如author_id = 5)出现在结果的顶部,然后按时间戳排序?明确一点:我不想按author_id 排序,我只想隔离author_id 专门为5 的帖子,然后按timestamp 排序其他所有内容。

有没有办法做到这一点?我试过了,

mysql_query("SELECT * FROM posts ORDER BY author_id = 5, timestamp");

...但它似乎不起作用。

【问题讨论】:

    标签: php mysql sql sorting


    【解决方案1】:

    试试这个:

    SELECT * FROM posts ORDER BY FIELD(author_id, '5') DESC, timestamp
    

    【讨论】:

    • 它似乎正在工作,除了它将匹配的行(author_id = 5 行)放在结果的底部而不是顶部。在FIELD() 之后的单个DESC 工作得很好。谢谢!
    【解决方案2】:
    ORDER BY CASE WHEN author_id=5 THEN 0 ELSE 1 END , timestamp
    

    这适用于大多数 RDBMS ,对于 MySQL 特定使用 @notulysses 的答案。

    【讨论】:

      【解决方案3】:

      我认为 Reza 的查询类似于:

      SELECT  * FROM posts WHERE author_id = 5
      UNION ALL
      (SELECT * FROM posts WHERE author_id <> 5 ORDER BY timestamp)
      

      这会将author_id 5 的结果放在顶部,然后其余的按时间戳。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多