2012-07-10 88 views
5

我在執行模塊時出現問題,其中一個project可能屬於多個categories。例如:項目「PHP程序員」屬於類別:編程,PHP。MySQL LEFT JOIN重複結果

假設下面的查詢(屬於類別1,3,11選擇項目):

SELECT projects.* FROM projects 
    LEFT JOIN pojects_category on projects.id = pojects_category.project_id 
    WHERE pojects_category.category_id IN (1,3,11) and projects.id='94'` 

我得到了同一項目兩次返回,因爲有在比賽中該表爲project_id = 94

projects_category架構:

CREATE TABLE IF NOT EXISTS `pojects_category` (
    `project_id` int(10) NOT NULL, 
    `category_id` int(10) NOT NULL, 
    KEY `category_id` (`category_id`), 
    KEY `project_id` (`project_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 


INSERT INTO `pojects_category` (`project_id`, `category_id`) VALUES 
(94, 3), 
(94, 1); 

我錯過了什麼嗎?

解決方案:使用GROUP BYDISTINCT

+1

如果您只想要每個項目中的一個,請將'GROUP BY project_id'附加到您的查詢 – mariusnn 2012-07-10 15:08:30

+0

@mariusnn謝謝,它的工作原理! – technology 2012-07-10 15:34:36

+0

不要使用group by,請參閱我的解釋 – Sebas 2012-07-10 15:40:33

回答

8

沒有,這是好的。這只是您想使用DISTINCT關鍵字刪除重複項的罕見情況之一。

在這種情況下,通過查詢的邏輯是正確的這一事實證明了這一點,儘管它返回多於一行。很多時候,當實際上查詢的邏輯錯誤時,可以看到DISTINCT的用法。

側面說明:

  • 你使用比其他IS NULL/IS NOT NULLWHERE子句中的表引用任何過濾器將使這個同桌參考反過來任何LEFT JOININNER JOIN,至於最終結果集行爲。 (看到這一點:https://stackoverflow.com/a/15483895/1291428
  • 你不應該使用GROUP BY模擬的DISTINCT的影響,原因有二:

    1 /這只是不是目的。 GROUP BY的其中一個影響是消除重複項,但其主要目的是根據一組標準對行進行分組,以便對它們應用一些分析計算/操作。

    2/GROUP BYORDER BY結果(在MySQL中),這不一定是你想要的,並在這種情況下減緩執行。請確保正確使用引擎提供的內容,從向前兼容的角度來看,這樣做總是更好。 (預計你所包含的理所當然不是)

關於。

+0

好吧,我不知道那個..我的團體是DISTINCT的同義詞。謝謝,現在我使用獨特的,它的作品很棒:) – technology 2012-07-10 20:09:28

+0

坦克用於明確關於DISTINCT和GROUP BY – mariusnn 2012-07-12 01:10:30

0

您也可以重寫此爲「IN」來解決重複:

SELECT projects.* 
FROM projects  
where projects.id in (select project_id 
         from projects_category 
         WHERE pojects_category.category_id IN (1,3,11) 
        ) and 
     projects.id='94' 

的「中」防止重複項,當您使用形成連接過濾記錄。