好的。我是 MySQL 的新手,有一个 SELECT 语句我无法理解。
我有一张主键为 ASIN(10 位 ISBN)的图书表,还有一张带有自动递增主键的标签表。然后我有一个联结表来显示哪些 ASIN 具有与之关联的标签。
我可以使用这个 SELECT 语句来给任何使用单个标签的书:
SELECT b.asin, b.title, b.img_thumb, b.filename FROM books AS b
INNER JOIN tag_junction AS tj USING (asin)
WHERE tj.tag_id=14
ORDER BY title
但我想做的是编写一个查询,该查询将通过 AND 和 OR 给出包含多个标签的任何书籍。我试过按如下方式编写它,但这不起作用。
SELECT b.asin, b.title, b.img_thumb, b.filename FROM books AS b
INNER JOIN tag_junction AS tj USING (asin)
WHERE tj.tag_id=14 AND tj.tag_id=12
ORDER BY title
所以基本上我希望查询返回同时使用 tag_id 14 和 tag_id 12 的任何书籍。我还希望能够查询使用 14 或 12 的书籍。
我错过了什么?
最佳答案
使用:
SELECT b.asin,
b.title,
b.img_thumb,
b.filename
FROM BOOKS b
JOIN TAG_JUNCTION tj ON tj.asin = b.asin
WHERE tj.tag_id IN (12, 14)
这将返回关联到的 BOOKS 记录:
- tag_id 12
- tag_id 14
- tag_id
12
和 tag_id14
的组合>
只要满足其中一项,就会返回关联的BOOKS记录。
要返回所有标签匹配的位置,您必须添加 GROUP BY 和 HAVING 子句:
SELECT b.asin,
b.title,
b.img_thumb,
b.filename
FROM BOOKS b
JOIN TAG_JUNCTION tj ON tj.asin = b.asin
WHERE tj.tag_id IN (12, 14)
GROUP BY b.asin, b.title, b.img_thumb, b.filename
HAVING COUNT(DISTINCT tj.tag_id) = 2
HAVING 子句中计数的数量必须匹配 IN
子句中指定的标记数。
关于sql - 我需要帮助编写一个复杂的(对我而言)SELECT 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3112719/