我有邮递员,报纸,他们传播报纸的地区的表,以及包含数据,报纸和报纸,邮递员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
GROUP BY d.d_id
Having n.price = Max(n.price)而且它的工作方式也不正确。
发布于 2014-03-16 21:55:53
你不能用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)上建立索引将有助于此查询更好地执行。
发布于 2014-03-16 22:10:35
因为您使用的是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)但是,第二个查询将返回存在多个报纸共享同一地区最高价格的所有匹配。
https://stackoverflow.com/questions/22437714
复制相似问题