我有三张桌子。

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的帖子,我应该如何synxtax我的查询?

最佳答案

若要仅返回两个类别中存在的结果,可以使用COUNT()聚合并在HAVING子句中验证返回2个结果。
在这个解决方案中,我加入了一个子查询,该子查询返回COUNT()perpostId,并且限制在这两个类别中。它被连接回主表以获取您想要的特定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

关于mysql - MySQL-查询语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14005726/

10-11 02:51
查看更多