2010-08-12 80 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 
相關問題