【问题标题】:MySQL How to Group While Sorting Query Result?MySQL如何在对查询结果进行排序时进行分组?
【发布时间】:2017-05-19 14:41:36
【问题描述】:

例如,我有一个名为“电影”的表格;

 |id|title |rating|
 |1 |Qwerty|4     |
 |2 |Zxcv  |0     |
 |3 |Asdf  |2     |
 |4 |Jkl   |0     |
 |5 |Uiop  |5     |

所以我想查询该表,结果必须按标题排序,但所有评分大于零的数据首先显示,并且也可能限制结果,例如从该表中,我希望查询结果像这个;

expected result with LIMIT 5
 |id|title |rating|
 |3 |Asdf  |2     |
 |5 |Uiop  |5     |
 |1 |Qwerty|4     |
 |4 |Jkl   |0     |
 |2 |Zxcv  |0     |

expected result with LIMIT 2
 |id|title |rating|
 |3 |Asdf  |2     |
 |5 |Uiop  |5     |

我试过这段代码,

 (SELECT * FROM films WHERE rating > 0 ORDER BY title) 
 UNION ALL 
 (SELECT * FROM films WHERE rating = 0 ORDER BY title) LIMIT 5

但在使用UNION ALL 时,() 中的order by 会被忽略。

【问题讨论】:

    标签: mysql sorting group-by sql-order-by union


    【解决方案1】:

    你可以构建一些东西作为声明来订购

    你应该可以使用类似的东西

    mysql> select * from films order by concat(if(rating > 0,0, 1), title);
    +-------+--------+
    | title | rating |
    +-------+--------+
    | aaa   |      3 |
    | ccc   |      5 |
    | bbb   |      0 |
    +-------+--------+
    3 rows in set (0.00 sec)
    

    在这种情况下,0 或 1 会在排序时添加到标题名称之前,您可以使用“a”和“b”,或者任何可用于排序的东西

    【讨论】:

    • 哇,这实际上是可行的。多谢!!非常好的逻辑,使用 concat 和 if 作为解决方法。
    【解决方案2】:

    您不应该在内部工会中使用 order by。这将导致发生两层排序。详情请阅读:https://dev.mysql.com/doc/refman/5.7/en/union.html

    对于您的示例,将查找所有电影并按标题和评级对其进行排序的查询是:

    SELECT * FROM films ORDER BY rating DESC, title;
    

    此查询首先抓取所有电影,然后按评分排序,评分较高(由DESC 指定,然后按电影标题。与读取查询的顺序相同。

    【讨论】:

    • 我也试过了,但结果也不像预期的那样,因为它会先按评分排序,但标题会出现不按顺序。因此,对于我的查询代码示例,结果将是 (id) 5,1,3,4,2,而正如您在上面看到的,我希望结果是 3,5,1,4,2,因为标题按顺序显示,同时将所有电影分组,排名靠前。
    • 已通过 Oliver 的回答解决,感谢您的回复!
    【解决方案3】:

    你需要在联合两个查询之后orderby 才能工作。如果您了解 limit 在这里的工作原理,那么您应该了解 order by 的工作原理

    (SELECT * FROM films WHERE rating > 0 ) 
    UNION ALL 
    (SELECT * FROM films WHERE rating = 0 ORDER BY title) ORDER BY title LIMIT 5
    

    【讨论】:

    • 我也试过了,但结果也不像预期的那样,因为最终联合结果将按名称排序,但不要将评分高于零的所有电影分组在顶部结果中,因此,对于我的查询代码示例,结果将是 (id) 3,4,1,5,2,而正如您在上面看到的,我希望结果是 3,5,1,4,2 ,因为标题按顺序显示,同时将所有电影分组,排名靠前
    • 已通过 Oliver 的回答解决,感谢您的回复!
    猜你喜欢
    • 2014-01-25
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    相关资源
    最近更新 更多