MySQL返回连接表的第一行

Al_*_*Al_ 9 php mysql sql join greatest-n-per-group

我有两个表(country和ducks),其中country表包含世界上的每个国家/地区,ducks表中有一个duckd列表,其中country_id字段链接到主国家/地区.

我正在试图获得一个只有至少有一只鸭子的国家名单,并且该鸭子表中的单一匹配记录是该国家中评级最高的鸭子.到目前为止,我有:

SELECT *
FROM country c 
INNER JOIN ducks d ON c.id = d.country_id
ORDER BY c.country ASC, d.rating DESC
Run Code Online (Sandbox Code Playgroud)

这将返回每个鸭子的列表,而不是每个国家只有一个.

如果有人能指出我正确的方向,我将不胜感激.我宁愿在SQL中执行它而不是为每个国家单独查询以获得最高评级的鸭子.

ype*_*eᵀᴹ 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
       )
Run Code Online (Sandbox Code Playgroud)

(country_id, rating, id)MyISAM表或(country_id, rating)InnoDB表的索引会有所帮助.

此查询将仅显示duck每个国家/地区一个,即使有多个具有相同的评级.如果你想要出现绑定评级的鸭子,请使用@ imm的GROUP BY答案.


Nal*_*ial 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
Run Code Online (Sandbox Code Playgroud)