Почему это левое соединение не показывает все данные из таблицы слева, которые не соответствуют таблице справа? (Баз данных) - PullRequest
2 голосов
/ 02 ноября 2011

У меня есть следующий запрос, в котором должны быть выбраны все статьи из Articles_New, которые либо находятся в A), но не в ArticlesInCategories_New или B), но не имеют CategoryID = 7, 8, 9, 10 или 11..

Удалив строки 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 ]

2 голосов
/ 02 ноября 2011

Вы хотите, чтобы все строки были либо :
А) нет в ArticlesInCategories_New
B) в ArticlesInCategories_New, но не имеют CategoryID = 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
1 голос
/ 02 ноября 2011

Вы описываете два набора статей, которые вы хотите - all the articles from Articles_New, которые удовлетворяют одному из следующих:

  • A) не в ArticlesInCategories_New
  • B) в ArticlesInCategories_New, но не имеют CategoryID = 7, 8, 9, 10 или 11.

Вы можете упростить этот сложный запрос, найдя эти два набора по отдельности, а затем объединить их с UNION.Это позволит вам тестировать и отлаживать каждый запрос отдельно.

...