2010-08-12 54 views
0

我想从3个连接的表中拉多个列,但我想结果集只包含一个不同的“数据条目”每pid(在数据输入表中是外部关键字的宠物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

您的GROUP BY应该包含所有非汇总列:
GROUP BY'p'。'id','o'。'id','o'。'email','d'。 “数”

全面查询:

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 
+0

实际上,您应该删除'd'。'数字'都来自SELECT和GROUP BY – iniju 2010-08-12 22:15:10

+0

嗨iniju - 我已经更新了您的建议查询,但我需要过滤掉任何具有相同pet_id的结果 - 我的意思是只选择data_entry与最高的号码 – franko75 2010-08-12 22:20:27

+0

哦,我现在看到。然后在两个位置保留'd'。'编号',并在GROUP BY部分后添加以下内容: HAVING'd'.'number' = MAX(d.number) – iniju 2010-08-12 22:57:57

0

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

LIMIT 1 

末。

+1

啊,但会限制查询只是一个结果总 – franko75 2010-08-12 22:14:35

+0

确定。我认为这太简单了,我绝对不会理解你的问题。 – Will 2010-08-12 22:15:40

+0

我会尝试更新原始文章以使其更清晰 – franko75 2010-08-12 22:25:41

2

不能同时选择数量和最大数量,而分组。 这是因为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 

的区别在于一个是分组和聚合的,而另一个是不分组的,但包含聚合列。我建议你删除dnumber从您的SELECT语句,只剩下最大(d.number) 这将解决您的问题,并且只有在oidoemail对于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