sql - 尝试连接表并按一个不同的最大值进行选择

标签 sql mysql greatest-n-per-group

我试图从 3 个连接表中提取多列,但我希望结果集每个 p.id 仅包含一个不同的“数据条目”( pet id,它是数据输入表中的外键)。我遇到的问题是,可能有两个数据条目,编号为 1 和 2,属于宠物 - 查询必须只选择编号最高的数据条目 - 这就是我尝试使用 max 和 group by 的原因,但它不太管用。谁能看到我哪里出错了?非常感谢

SELECT `p`.`id`, `o`.`id`, `o`.`email`, MAX(d.number), `d`.`number`
FROM (`pets` AS `p`, `owners` AS `o`, `data_entries` AS `d`) 
WHERE `p`.`owner_id` = `o`.`id` 
AND `p`.`id` = `d`.`pet_id` 
GROUP BY `p`.`id` 
ORDER BY `d`.`number` DESC

编辑:按照iniju的建议,我尝试了以下查询,但这并没有过滤掉数字低于同一宠物的另一个数据条目的数据条目:

SELECT `p`.`id`, `o`.`id`, `o`.`email`, `d`.`number`
FROM (`pets` AS `p`, `owners` AS `o`, `data_entries` AS `d`) 
WHERE `p`.`owner_id` = `o`.`id` 
AND `p`.`id` = `d`.`pet_id` 
GROUP BY `p`.`id`, `o`.`id`, `o`.`email`, `d`.`number`
HAVING `d`.`number`=MAX(`d`.`number`)

最佳答案

分组时不能同时选择数量和最大数量。 这是因为 MAX 函数基于分组的聚合。在您的情况下,您还选择列本身,这将为每个不同的数字创建一行...而不是每个不同的 MAX 数字。

假设您有 4 行:

PET    NUMBER
A      1
A      2
B      4
B      2

您希望结果集是:

PET  MAX
A    2
B    4

或者您希望它是:

PET  NUM  MAX
A    1    2
A    2    2
B    4    4
B    2    4

区别在于,一个已分组并聚合,而另一个未分组但包含聚合列。

我建议您从 SELECT 语句中删除 d.number,只保留 MAX(d.number) 当且仅当 o.ido.email 是唯一的时,这才能解决您的问题p.id

的连接记录

试试这个:

SELECT `p`.`id`, `o`.`id`, `o`.`email`, MAX(d.number)
FROM `data_entries` AS `d`
JOIN `pets` `p` ON `p`.`ID` = `d`.`pet_id`
JOIN `owners` `o` ON `o`.`ID` = `p`.`owner_id`
GROUP BY  `p`.`id`, `o`.`id`, `o`.`email`
ORDER BY MAX(d.number) DESC

关于sql - 尝试连接表并按一个不同的最大值进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3472415/

相关文章:

mysql - 获取每组分组 SQL 结果中最大值的记录

mysql - 优化 SQL 查询

php - 找到第一个达到目标的用户

sql - PostgreSQL:返回按外键列分组的最新行

sql - 按月考勤获取星级员工记录

php - 每页有多个表单的 jQuery forms.js

mysql - 我想要获得相同的行名称,但我们想要获得依赖的数据

php - 在迁移中运行原始 SQL

具有线性插值和分组依据的 SQL 查询

SQL:如何仅获取每个用户的第一个用户操作