MySQL返回连接表的第一行

时间:2012-03-04 21:52:21

标签: php mysql sql join greatest-n-per-group

我有两个表(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中这样做而不是为每个国家单独查询以获得最高级别的鸭子。

5 个答案:

答案 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()”!