2

我有 3 张桌子。

news:
id
title

categories:    
id
name

newsEachCategories:
postId
categoryId

表 newsEachCategories 保存每个帖子的 id 和发布它的类别的 id。

因此,如果 id 为 13 的帖子已发布在类别 6 和 7 中,则有两个条目,一个是“postId 13 , categoryId 6”,另一个是“postId 13 , categoryId 7”。

因此,为了查找属于某个类别的所有帖子(例如 id 为 5 的类别),我使用:

SELECT news.title , news.editedTitle , news.id
FROM news JOIN newsEachCategories
ON news.id = newsEachCategories.postId
WHERE  newsEachCategories.categoryId = 5

如果我想选择属于 5 类和 6 类的帖子,我应该如何对我的查询进行语法分析?

4

1 回答 1

4

要仅返回两个类别中都存在的结果,您可以使用COUNT()聚合并在您的HAVING子句中验证是否返回了 2 个结果。

在这个解决方案中,我加入了一个返回COUNT()per的子查询postId,并限制了这两个类别中的那些。这将连接回主表以获得您想要的特定列的剩余列news.id

SELECT 
  news.title,
  news.editedTitle,
  news.id
FROM
  news
  /* Join against subquery to count occurrences in newsEachCategories */
  JOIN (
    SELECT postId, COUNT(DISTINCT categoryId) AS postcount 
    FROM newsEachCategories 
    /* Limit to categories 5 & 6 */
    WHERE categoryId IN (5, 6)
    GROUP BY postId
    /* Ensures a result was returned for each category 5, 6 */
    HAVING postcount = 2
  ) postCounts ON news.id = postCounts.postId
于 2012-12-22T19:15:40.770 回答