2011-11-02 49 views
2

我有以下的查詢,應該是從Articles_New中選擇所有文章,它們是A)不在ArticlesInCategories_New或B)中,但沒有CategoryID = 7,8,9,10,或11.爲什麼不是這個左連接顯示左邊的表與右邊的表不匹配的所有數據? (MySQL)

通過刪除Category!=行,我確定問題是(至少)Articles_New沒有選擇Articles_New中不在ArticlesInCategories_New中的所有內容。我還是不太瞭解GroupBy,但是我基於其他問題,我嘗試過GroupBy Articles_New.ArticleID,但這並沒有改變任何事情。

SELECT 
     DISTINCT Articles_New.ArticleID, 
     DATE_FORMAT(Articles_New.PublicationDate, '%c/%e/%Y') AS ReleaseDate, 
     Articles_New.Title, 
     Articles_New.Type, 
     Articles_New.URL 
    FROM 
     Articles_New 
     LEFT JOIN ArticlesInCategories_New 
      ON ArticlesInCategories_New.ArticleID = Articles_New.ArticleID 
    WHERE 
     PublicationDate >= DATE_SUB(CURDATE(), INTERVAL 2 MONTH) AND 
     PublicationDate <= CURDATE() AND 
     Articles_New.Public = '1' 
     AND ArticlesInCategories_New.CategoryID != '7' 
     AND ArticlesInCategories_New.CategoryID != '8' 
     AND ArticlesInCategories_New.CategoryID != '9' 
     AND ArticlesInCategories_New.CategoryID != '10' 
     AND ArticlesInCategories_New.CategoryID != '11' 
    ORDER BY 
     Articles_New.PublicationDate DESC, 
     Articles_New.ArticleID DESC 

回答

2

您想獲得要麼所有行:
A)未在ArticlesInCategories_New
B)在ArticlesInCategories_New,但不具備類別ID = 7,8,9,10,或11

SELECT DISTINCT 
    Articles_New.ArticleID, 
    DATE_FORMAT(Articles_New.PublicationDate, '%c/%e/%Y') AS ReleaseDate, 
    Articles_New.Title, 
    Articles_New.Type, 
    Articles_New.URL 
FROM 
    Articles_New 
    LEFT JOIN ArticlesInCategories_New 
     ON ArticlesInCategories_New.ArticleID = Articles_New.ArticleID 
WHERE 
    (
    ArticlesInCategories_New.ArticleID IS NOT NULL AND 
    PublicationDate BETWEEN DATE_SUB(CURDATE(), INTERVAL 2 MONTH) AND CURDATE() 
    AND Articles_New.Public = '1' 
    AND ArticlesInCategories_New.CategoryID NOT IN ('7','8','9','10','11') 
    ) 
    OR 
    (
    ArticlesInCategories_New.ArticleID IS NULL 
    ) 
ORDER BY 
    Articles_New.PublicationDate DESC, 
    Articles_New.ArticleID DESC 
+0

完美地工作,謝謝!我不明白爲什麼'ArticlesInCategories_New.ArticleID IS NULL'是必需的。這不是使用'LEFT JOIN'的目的嗎? –

+0

@John,你有2個條件。 'null'測試測試第一個條件:它返回所有有**沒有匹配**的行。另一個測試是針對第二個條件。在那裏我加了'不是空',因爲你說必須有一個匹配。 – Johan

+1

@John,左連接返回左表(Articles_New)中的所有行,這些行的數據表匹配右表(ArticlesInCategories_New){null,表示不匹配的那些} – Johan

1

您描述兩套文章,你想要的 - all the articles from Articles_New滿足下列之一:)

  • 一個不ArticlesInCategories_New
  • B)在ArticlesInCategories_New,但沒有CategoryID = 7,8,9,10或11.

您可以通過查找這兩個集合來簡化這個複雜的查詢率,然後結合他們與UNION。這將允許您分別測試和調試每個查詢。

+0

沒有測試,這聽起來像你的答案會起作用。但是,寫兩條語句並將它們與'UNION'結合起來真的可以簡化它嗎?這似乎同樣複雜 –

+1

意見可能會有所不同 - 但我認爲重要的優勢是您可以'單獨測試和調試每個查詢'。 –

相關問題