【问题标题】:GROUP BY & ORDER BY - Ordering by a specific fieldGROUP BY & ORDER BY - 按特定字段排序
【发布时间】:2011-05-25 08:10:24
【问题描述】:

我需要编写一个查询,该查询返回按该类中最受欢迎的项目排序的唯一“类”列表。这是一个示例查询:

SELECT items.title, items.popularity 
FROM items, classes 
WHERE class_id = classes.id 
GROUP BY class_id 
ORDER BY MAX(items.popularity) DESC

此查询返回正确的类,但它返回的项目是表中出现的第一个而不是最流行的。

我也试过了:

SELECT MAX(items.title), items.popularity 
FROM items, classes 
WHERE class_id = classes.id 
GROUP BY class_id 
ORDER BY MAX(items.popularity) DESC

所有变体 - 这只是返回最新添加的而不是最流行的。

我已阅读 lotslots 的其他答案。

我确定有一个简单的答案,请帮忙!

【问题讨论】:

  • ORDER BY MAX(items.popularity) DESC 对我来说甚至没有意义...... ORDER BY 应该按列排序,而 MAX 从该列返回单个值。不应该只是ORDER BY popularity DESC 来获取顶部有最大popularity 的项目吗?
  • 当你 GROUP BY 时,它似乎选择了最古老的记录来领导该组,而忽略了所有的人气。使用 MAX 函数可以解决很多类似问题。
  • GROUP BY 通常用于进行分析,例如 MAX、MIN、AVG、COUNT 等...“最旧”记录无关紧要,因为通常,GROUP BY 用于汇总/聚合无数条记录变成一两条记录。我承认我什至不确定您所说的那句话是什么意思,尽管听起来您可能对 ORDER BY 和 GROUP BY 感到困惑......
  • ...我还有一个问题:为什么classes 包含在此查询中?我看不出将items 加入classes 的原因,因为您没有从classes 中选择任何东西,而且连接条件似乎微不足道,除非items 中可能有一个class_id i>不存在在classes...
  • 这是一个很好的观点,完整的查询确实需要类。但是我应该从简化示例中删除它。

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


【解决方案1】:

你没有从类中选择任何东西,所以不需要那个表:

select i.*
from (
    SELECT class_id, max(popularity) as MaxPopularity
    FROM items 
    GROUP BY class_id  
) ip
inner join items i on ip.class_id = i.class_id 
    and ip.MaxPopularity = i.popularity

注意:如果一个类中有多个具有相同流行度的项目,您可能会得到重复。

【讨论】:

  • 我认为子查询可能是唯一的答案 - 我没有这个工作,但你在正确的路线上。
【解决方案2】:

我的猜测是您应该按降序排列 MAX(popularity),尝试在查询末尾添加 DESC。

【讨论】:

  • 抱歉,我在语句中添加了 DESC。它应该被包括在内。
【解决方案3】:

我没有尝试过,但我认为它应该可以工作......

SELECT MAX(items.title), items.popularity 
FROM items, classes 
WHERE class_id = classes.id 
GROUP BY class_id 
ORDER BY items.popularity DESC

【讨论】:

    【解决方案4】:
    SELECT items.title, items.popularity 
    FROM items, classes 
    WHERE class_id = classes.id 
    ORDER BY items.popularity DESC
    

    您不应该需要 group by,因为您已经在 where 语句中选择了特定的类。此外,order by 中的 DESC 应该处理订单而不需要 MAX。

    【讨论】:

      猜你喜欢
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 2019-01-27
      • 2017-02-06
      • 2013-01-24
      相关资源
      最近更新 更多