尝试连接表并选择一个不同的最大值

时间:2010-08-12 22:07:29

标签: 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`)

3 个答案:

答案 0 :(得分:2)

分组时,您无法同时选择数字和MAX数字。 这是因为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语句中删除dnumber,只留下MAX(d.number) 这将解决您的问题,当且仅当oidoemailp的已加入记录而言是唯一的。{{ 1}}

试试这个:

id

答案 1 :(得分:0)

如果我正确理解你的问题,你需要

LIMIT 1

最后。

答案 2 :(得分:0)

您的GROUP BY应包含以下所有非聚合列:
GROUP BY'p'。'id','o'。'id','o'。'email','d'。'number'

完整查询:

SELECT `p`.`id`, `o`.`id`, `o`.`email`, MAX(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`  
ORDER BY `d`.`number` DESC