我有两个表(country& ducks),其中country table包含世界上的每个国家/地区,ducks表中有一个duckse列表,其中country_id字段链接到主国家。
我正在尝试获得一个仅包含至少一只鸭子的国家的列表,并且该鸭子表中的单个匹配记录是该国家中评级最高的鸭子。到目前为止,我有:
SELECT *
FROM country c
INNER JOIN ducks d ON c.id = d.country_id
ORDER BY c.country ASC, d.rating DESC
这会返回每个鸭子的列表,而不是每个国家只有一个。
如果有人能指出我正确的方向,我将不胜感激。我宁愿在SQL中这样做而不是为每个国家单独查询以获得最高级别的鸭子。
答案 0 :(得分:19)
SELECT c.*, d.*
FROM country c
INNER JOIN ducks d
ON d.id = --- guessing the ducks Primary Key here
( SELECT dd.id --- and here
FROM ducks dd
WHERE c.id = dd.country_id
ORDER BY dd.rating DESC
LIMIT 1
)
MyISAM表的(country_id, rating, id)
索引或InnoDB表的(country_id, rating)
索引会有所帮助。
此查询每个国家/地区只会显示一个duck
,即使有多个具有相同的评分。如果您想要出现具有绑定评级的鸭子,请使用@ imm的GROUP BY
答案。
答案 1 :(得分:8)
您可以尝试为
添加选择联接SELECT c.*, d.*
FROM country c
INNER JOIN ducks d ON c.id = d.country_id
LEFT JOIN ducks d2 ON d.country_id = d2.country_id AND d2.rating > d.rating
WHERE d2.id IS NULL
答案 2 :(得分:3)
您可以尝试:
SELECT c.*, d.*
FROM country c
INNER JOIN (
SELECT d.country_id, d.id, MAX(d.rating) AS rating
FROM ducks d
GROUP BY d.country_id
) q ON (q.country_id = c.id)
INNER JOIN ducks d
ON (d.country_id, d.rating) = (q.country_id, q.rating)
答案 3 :(得分:0)
试试这个:
SELECT c.country, MAX(d.rating) AS max_rating
FROM country c
JOIN ducks d ON c.id = d.country_id
GROUP BY c.id
ORDER BY c.country ASC
如果“最高评分”为1,则将MAX(d.rating)
更改为MIN(d.rating)
答案 4 :(得分:-1)
许多数据库都有一些“从...中选择前10 *”。在mySql中,语法为“select * from ... limit 10”。
......但是......
在这种情况下,你真的想要“分组依据”和“max()”!