2012-10-15 61 views
45

SELECT name, price, photo FROM drinks, drinks_photos WHERE drinks.id = drinks_idSELECT * FROM多個表。 MySQL

yeilds 5行(5個數組),photo是連續唯一唯一的字段。 name, price得到重複(這裏,fanta-name, price重複3次。)我如何擺脫這些重複?

編輯:我想要name, price和所有photo爲每個飲料。

id  name  price 
    1. fanta  5 
    2.  dew   4 


id  photo     drinks_id 
    1.  ./images/fanta-1.jpg  1 
    2.  ./images/fanta-2.jpg  1 
    3.  ./images/fanta-3.jpg  1 
    4.  ./images/dew-1.jpg  2 
    5.  ./images/dew-2.jpg  2 
+4

那麼你有5匹配的行,因爲你有幾行drink_id相同。你會期望*會發生什麼?你希望保留哪張照片? –

回答

66

你在這裏做什麼是所謂的JOIN(雖然你做它含蓄,因爲你從多個表中選擇)。這意味着,如果您沒有在您的WHERE子句中添加任何條件,那麼這些表中的所有組合都是。只有在您的條件下,您才能將加入限制爲飲料ID匹配的那些行。

但仍有X的結果多行,每喝一杯,如果有X的照片與此特定drinks_id。您的聲明不限制哪個您想要的照片!

如果只想喝每一個行,你必須告訴SQL你想,如果有與特定drinks_id多行做什麼。爲此,您需要分組和aggregate function。您告訴SQL您想要將哪些條目組合在一起(例如所有相同的drinks_id),並且在SELECT中,必須告知應該採用每個分組結果行的不同條目。對於數字,這可以是平均值,最小值,最大值(僅舉一些)。

在你的情況,我看不到感查詢照片飲料,如果你只想要一行。您可能認爲您的結果中可能會有陣列照片,但SQL無法執行此操作。如果你只是想任何照片,你不在乎,你會被drinks_id得到的,只是組(爲了得到每飲料只有一行):

SELECT name, price, photo 
FROM drinks, drinks_photos 
WHERE drinks.id = drinks_id 
GROUP BY drinks_id 

name  price photo 
fanta 5  ./images/fanta-1.jpg 
dew  4  ./images/dew-1.jpg 

在MySQL中,我們也有GROUP_CONCAT,如果你想要的文件名要連接到一個單一的字符串:

SELECT name, price, GROUP_CONCAT(photo, ',') 
FROM drinks, drinks_photos 
WHERE drinks.id = drinks_id 
GROUP BY drinks_id 

name  price photo 
fanta 5  ./images/fanta-1.jpg,./images/fanta-2.jpg,./images/fanta-3.jpg 
dew  4  ./images/dew-1.jpg,./images/dew-2.jpg 

但是,如果在字段值中有,,這可能會變得很危險,因爲很可能您想在客戶端再次拆分它。它也不是一個標準的SQL聚合函數。

+0

是的,我想要每個飲料的名稱,價格和圖像陣列。 – NestedWeb

+1

圖像數組...你真的知道什麼是一個關係數據庫嗎? –

+2

您使用哪種語言編寫程序來執行這些查詢?因爲MySQL不支持數組作爲字段類型。你必須像使用'GROUP_CONCAT'一樣做一些字符串技巧並再次分割。一個通常不會在關係數據庫中這樣做。您應該在程序中進行分組,而不是在SQL中(檢測重複的ID並在程序中構建這些數組)。 – leemes

0

爲了通過drinks.id擺脫重複的,可以羣。但是這樣你每個drinks.id只能得到一張照片(你得到的照片取決於數據庫的內部實現)。

雖然它沒有記錄,在MySQL的情況下,你會得到與最低id(以我的經驗,我從來沒有見過的其他行爲)的照片。

SELECT name, price, photo 
FROM drinks, drinks_photos 
WHERE drinks.id = drinks_id 
GROUP BY drinks.id 
+1

你應該更好地通過id進行分組。始終按唯一字段進行分組,以獲取源表的不同行。在你的情況下,如果兩種飲料具有相同的名稱(但是在表格中有不同的行),你也可以將它們組合在一起。 – leemes

+0

謝謝leemes,我沒有注意到有唯一的id字段。我編輯了我的答案。當然使用id更好。 @ypercube,你真的覺得,你的評論增加了一些通常發佈的內容嗎? – bhovhannes

+0

@ bhovhannes:不,你說得對,對不起。 Snarky的評論沒有添加任何有用的東西。更正的答案更好 - 儘管我仍然不同意這種使用「GROUP BY」(這不是SQL標準),沒有解釋它爲什麼會起作用以及它如何爲每一杯飲料返回一個半隨機的「照片」。 (*中的*「first」* *「你會得到第一張照片」*短語恰恰是錯誤的)。 –

2

您將有名稱和價格在這裏重複的值。而且id在drinks_photos表中是重複的。你無法避免它們。你究竟想要輸出什麼?