我试图从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`)
答案 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语句中删除d
。number
,只留下MAX(d.number)
这将解决您的问题,当且仅当o
。id
和o
。email
对p
的已加入记录而言是唯一的。{{ 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