php - MySQL返回连接表的第一行

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

我有两个表(国家和鸭子),其中国家表包含世界上的每个国家,鸭子表有一个鸭子列表,其中包含一个 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 中执行此操作,也不愿为每个国家/地区单独查询以选出评分最高的鸭子。

最佳答案

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) 索引会有所帮助。

此查询将只显示每个国家/地区的一只鸭子,即使有多只鸭子具有相同的评级。如果您希望出现评级相同的鸭子,请使用@imm 的GROUP BY 答案。

关于php - MySQL返回连接表的第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9559161/

相关文章:

php - SQL 分组不按预期工作

php - 图像链接存储在数据库中

mysql - 基于按位运算条件的列求和

php - 如何为 PHPMailer 设置 DSN(传递状态通知)?

javascript - 发送数据到MySQL并显示更新的DB(AJAX)

Mac 上的 MySQL Workbench - 服务器管理操作失败

mysql - 导入以前导出的 mysql 触发器时出错

php - 通知: Array to string conversion with update statment

sql - MySQL 中 MyISAM 存储引擎上的检查约束等约束,而不是空约束

php - 我将如何构造一个 mysql 查询来使用多个 AND 运算符?