sql - 我需要帮助编写一个复杂的(对我而言)SELECT 语句

标签 sql mysql

好的。我是 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_id 14 的组合>

只要满足其中一项,就会返回关联的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/

相关文章:

mysql - 通过 Node MySQL 函数传递变量

MySQL Left Join Right Join union 返回不正确的数据

sql - T-SQL 存储过程中的空比较

mysql - 获取每个部门的最新记录

mysql - SQL 更新加入错误

python - Django 数据库未迁移

sql - 选择满足某些条件且在某一列中具有最大值的行

使用 STUFF 函数进行 SQL 查询需要很长时间

php - 如何防止网页中出现奇怪的字符

php - WHERE sessionId = session 或 IF NOT MATCHING WHERE this is this。数据库管理系统