2011-11-02 89 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

意见可能会有所不同 - 但我认为重要的优势是您可以'单独测试和调试每个查询'。 –

相关问题