【问题标题】:How to make a query with AND operator between rows [duplicate]如何在行之间使用AND运算符进行查询[重复]
【发布时间】:2019-06-06 12:31:47
【问题描述】:

我有下表,女巫是帖子和标签之间的关系透视表:

post_tags table

我需要获取严格包含“X”给定标签的帖子。

例如:

  • 如果我需要只包含标签 1 和 2 的帖子,它应该返回 post_id 1 和 4。

  • 如果我需要带有标签 2 的帖子,它应该只返回 post_id 3。

  • 如果我需要标签为 23 的帖子,它不应该返回任何内容。

我试过了:

SELECT * FROM `post_tags` WHERE tag_id = 1 OR tag_id = 2;

但显然它返回所有带有这些tags_id的post_id

还有:

SELECT * FROM `post_tags` WHERE tag_id = 1 AND tag_id = 2;

它不会返回任何内容,因为它试图在列之间进行比较。

有什么办法吗?

【问题讨论】:

标签: mysql sql


【解决方案1】:

您需要group by post_id并检查having子句中的条件:

SELECT post_id
FROM post_tags
GROUP BY post_id
HAVING 
  SUM(tag_id NOT IN (1, 2)) = 0
  AND
  COUNT(DISTINCT tag_id) = 2

这将只返回带有标签 1 和 2 的帖子,而没有其他标签。
对于只有标签 2 的帖子:

SELECT post_id
FROM post_tags
GROUP BY post_id
HAVING 
  SUM(tag_id <> 2) = 0
  AND
  COUNT(DISTINCT tag_id) = 1

如果每个post_id, tag_id 对都是唯一的,那么您可以这样做:

SELECT post_id
FROM post_tags
GROUP BY post_id
HAVING COUNT(tag_id IN (1, 2)) = COUNT(tag_id)

【讨论】:

    【解决方案2】:

    您可以使用相关子查询:

    SELECT *
    FROM post_tags pt
    WHERE (
            SELECT count(*) 
            FROM post_tags
            WHERE pt.post_id = post_id
                AND post_tag IN (1, 2)
    
            ) = 2
    

    或者您可以使用 in 列表(使用类似的逻辑):

    SELECT *
    FROM post_tags pt
    WHERE post_id IN (
            SELECT post_id
            FROM post_tags
            WHERE post_tag IN (1, 2)
            GROUP BY post_id
            HAVING count(*) = 2
            )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 2019-07-10
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      相关资源
      最近更新 更多