【问题标题】:Looks simple, but I'm stumped!看起来很简单,但我很难过!
【发布时间】:2009-09-01 00:46:54
【问题描述】:

这应该很简单,但我正在画一个空白。我有两张桌子。

Table:article_tag_pvt
colum: article_id
column: tag_id

Table: tag
column: tag_id
column: name

article_tag_pvt 表是一个多对多数据透视表。

问题是,我需要一个给定标签名称列表的查询,它将检索仅与这些标签名称匹配的文章 ID。这些表的基本连接如下所示:

SELECT article_id
FROM article_tag_pvt pvt
INNER JOIN tag t ON t.tag_id = pvt.tag_id

我已经有一个查询,它将检索与指定的任何标签名称匹配的文章 ID。这看起来像这样:

SELECT article_id
FROM article_tag_pvt pvt
INNER JOIN tag t ON t.tag_id = pvt.tag_id
WHERE t.name IN ('events','news')

我尝试了这些,但没有任何乐趣:

SELECT article_id
FROM article_tag_pvt pvt
INNER JOIN tag t ON t.tag_id = pvt.tag_id
WHERE t.name = 'events' AND t.name = 'news'

SELECT article_id
FROM article_tag_pvt pvt
INNER JOIN (
SELECT tag_id
FROM tag
WHERE name IN ('events','news')
) AS t
ON t.tag_id = pvt.tag_id

任何帮助将不胜感激

戴夫

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql


    【解决方案1】:

    问题是您会得到所有包含事件或新闻的行。如果您在多对多表中从来没有超过 1 个事件或新闻,您可以使用 GROUP BY 和 HAVING 来解决它

    SELECT article_id
    FROM article_tag_pvt pvt
    INNER JOIN tag t ON t.tag_id = pvt.tag_id
    WHERE t.name = 'events' OR t.name = 'news' 
    GROUP BY article_id HAVING count(*) = 2
    

    【讨论】:

      【解决方案2】:

      我的偏好是:

      SELECT pvt.article_id
        FROM article_tag_pvt pvt
        JOIN tag t ON t.tag_id = pvt.tag_id AND t.name = 'events'
        JOIN tag t2 ON t2.tag_id = pvt.tag_id AND t2.name = 'news'
      

      使用 GROUP BY/HAVING 的替代方法:

        SELECT pvt.article_id
          FROM article_tag_pvt pvt
          JOIN tag t ON t.tag_id = pvt.tag_id
         WHERE t.name IN ('events', 'news')
      GROUP BY pvt.article_id, t.name
        HAVING COUNT(DISTINCT t.name) = 2
      

      COUNT(DISTINCT t.name) 需要等于您为 t.name IN 子句定义的选项数。

      【讨论】:

      • 感谢 Rexem 提供这些。在您的第二个解决方案中使用 Dimus 的方法,计数工作不太正确。标签的数量可能会变得很长,因此决定反对多个连接。感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多