我正在尝试学习如何使用JOIN,而对于我的生活,我似乎无法理解我需要获得我想要的结果的查询。
我的表格:
我想要实现的目标是:
从标记为黄金和白银的文章中选择所有文章
我相信我的桌子关系没问题,Green是PK&Red FK&#39>。
我已经做了多次尝试,这是我最新的:
SELECT Articles.Article_Name, Articles_Tagged.Tag_ID, Tags.Tag_Name
FROM Articles
INNER JOIN Articles_Tagged ON Articles.Article_ID=Articles_Tagged.Article_ID
WHERE Articles_Tagged.Tag_Name='Gold' AND Articles_Tagged.Tag_Name='Silver';
我相信我的问题是JOIN,我认为这是在抛出这个信息:
The multi-part identifier "Tags.Tag_Name" could not be bound.
答案 0 :(得分:3)
join
将构造由您加入的每个表组成的行(当然包括from
子句中的行)。因为没有一行会 " Gold"和"银"在其中,您的查询将永远不会返回任何行。
解决这个问题的一种方法是计算有多少不同的" Gold"和"银"标记文章,并返回两个:
SELECT *
FROM articles a
WHERE EXISTS (SELECT at.article_id
FROM articles_tagged at
JOIN tags t ON at.tag_id = t.tag_id
WHERE at.article_id = a.article_id AND
tag_name IN ('Gold', 'Silver')
GROUP BY at.article_id
HAVING COUNT(DISTINCT tag_name) = 2)
答案 1 :(得分:1)
您可以获得具有金色和银色标签的文章ID。然后从这些文章id池中获取所有文章。我无法尝试。以下查询中存在一些语法错误。但它提出了主要的想法。
SELECT * FROM Articles WHERE Article_ID IN
((SELECT Articles_Tagged.Article_ID
FROM Articles_Tagged
WHERE Articles_Tagged.Article_Tagged_ID = 1)
INTERSECT
(SELECT Articles_Tagged.Article_ID
FROM Articles_Tagged
WHERE Articles_Tagged.Article_Tagged_ID = 2
)
)
答案 2 :(得分:-1)
SELECT Articles.Article_Name, Articles_Tagged.Tag_ID, Tags.Tag_Name
FROM Articles
INNER JOIN Articles_Tagged ON
Articles.Article_ID = Articles_Tagged.Article_ID
INNER JOIN Tags ON Articles_Tagged.Tag_ID = Tags.Tag_ID
WHERE Articles_Tagged.Tag_Name = 'Gold'
OR Articles_Tagged.Tag_Name = 'Silver';
您忘了加入Tags表,条件是标记为Gold和Silver的文章,使用 OR 而不是和
答案 3 :(得分:-2)
这应该是这样的
SELECT Articles.Article_Name, Articles_Tagged.Tag_ID, Tags.Tag_Name FROM Articles
INNER JOIN Articles_Tagged ON Articles.Article_ID=Articles_Tagged.Article_ID
INNER JOIN TAGS ON TAGS.TAGID=Articles_Tagged.TAG_ID
WHERE TAGS.Tag_Name='Gold' AND TAGS.Tag_Name='Silver';