首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过group by找到属性值最大的行?

如何通过group by找到属性值最大的行?
EN

Stack Overflow用户
提问于 2014-03-16 21:51:49
回答 2查看 135关注 0票数 0

我有邮递员,报纸,他们传播报纸的地区的表,以及包含数据,报纸和报纸,邮递员id,邮递员传播报纸的表‘实现’。我必须找到每个地区最贵的报纸;我写

代码语言:javascript
复制
  SELECT * 
  FROM realization r 
  JOIN newspaper n 
  ON r.np_index = n.np_index 
  JOIN district d 
  ON d.d_id = r.d_id
  GROUP BY d.d_id
  Having n.price = Max(n.price)

而且它的工作方式也不正确。

EN

回答 2

Stack Overflow用户

发布于 2014-03-16 21:55:53

你不能用group by得到这一点。您需要显式地使用逻辑来查找每个地区中最昂贵的方法(在其他数据库中还有其他方法,但MySQL不支持它们)。最值得学习的可能是not exists方法:

代码语言:javascript
复制
SELECT *
FROM realization r JOIN
     newspaper n 
     ON r.np_index = n.np_index JOIN
     district d 
     ON d.d_id = r.d_id
WHERE NOT EXISTS (select 1
                  from newspaper n2
                  where n2.d_id = n.d_id and
                        n2.price > n.price
                 );

逻辑是这样说的:“给我原始表中的所有行,那里没有价格更高的报纸”。这是得到的最高价格。请注意,如果多篇论文具有相同的价格,这将为每个地区返回多行。要获得任意值,可以将group by d.d_id添加到查询中。

newspaper(d_id, price)上建立索引将有助于此查询更好地执行。

票数 0
EN

Stack Overflow用户

发布于 2014-03-16 22:10:35

因为您使用的是mysql,所以可以使用它的非标准分组来简单地获取它:

代码语言:javascript
复制
SELECT * FROM (
    SELECT *
    FROM realization r 
    JOIN newspaper n ON r.np_index = n.np_index 
    JOIN district d ON d.d_id = r.d_id
    ORDER BY n.price desc) x
GROUP BY d.d_id

如果没有时髦的分组支持,可以使用相关子查询(这在所有数据库中都有效):

代码语言:javascript
复制
SELECT *
FROM realization r 
JOIN newspaper n ON r.np_index = n.np_index 
JOIN district d ON d.d_id = r.d_id
WHERE n.price = (
    SELECT MAX(price)
    FROM realization r2
    JOIN newspaper n2 ON r2.np_index = n2.np_index 
    JOIN district d2 ON d2.d_id = r2.d_id
    WHERE d2.d_id = d.id)

但是,第二个查询将返回存在多个报纸共享同一地区最高价格的所有匹配。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22437714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档