我有邮递员,报纸,地区的桌子,他们传播报纸和桌子'实现',其中包含数据,报纸和邮编,邮递员身份证,邮差传播报纸。 我必须在每个地区找到最贵的报纸; 我写了
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)
它的工作原理不正确。
答案 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)
但是,第二个查询将返回所有匹配,其中有多个报纸共享相同的区域最高价格。