如何使用group by找到具有最大属性值的行?

时间:2014-03-16 13:51:49

标签: mysql sql

我有邮递员,报纸,地区的桌子,他们传播报纸和桌子'实现',其中包含数据,报纸和邮编,邮递员身份证,邮差传播报纸。 我必须在每个地区找到最贵的报纸; 我写了

  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)

它的工作原理不正确。

2 个答案:

答案 0 :(得分:0)

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

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)上的索引可以帮助此查询更好地运行。

答案 1 :(得分:0)

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

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

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

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)

但是,第二个查询将返回所有匹配,其中有多个报纸共享相同的区域最高价格。