Mysql 关于查询关系表的帮助
我正在努力摆脱SQL技能的束缚,需要一些关于以下查询的帮助。我目前使用的数据库是mysql 我想检索分配了“tag2”和“tag4”的所有抽认卡。根据下面摘录中看到的现有表的内容,查询应返回两行:FlashCard_ID 1和2 我将如何表述这个查询?我已经有一段时间没有这样做了Mysql 关于查询关系表的帮助,mysql,sql,Mysql,Sql,我正在努力摆脱SQL技能的束缚,需要一些关于以下查询的帮助。我目前使用的数据库是mysql 我想检索分配了“tag2”和“tag4”的所有抽认卡。根据下面摘录中看到的现有表的内容,查询应返回两行:FlashCard_ID 1和2 我将如何表述这个查询?我已经有一段时间没有这样做了 mysql> select * from flashcard; +--------------+------------+----------+ | FLASHCARD_ID | QUESTION | ANS
mysql> select * from flashcard;
+--------------+------------+----------+
| FLASHCARD_ID | QUESTION | ANSWER |
+--------------+------------+----------+
| 1 | Question 1 | Answer 1 |
| 2 | Question 2 | Answer 2 |
| 3 | Question 3 | Answer 3 |
+--------------+------------+----------+
3 rows in set (0.00 sec)
mysql> select * from tag;
+--------+------+
| TAG_ID | NAME |
+--------+------+
| 1 | tag1 |
| 2 | tag2 |
| 3 | tag3 |
| 4 | tag4 |
| 5 | tag5 |
+--------+------+
5 rows in set (0.00 sec)
mysql> select * from flashcard_tags;
+--------+--------------+
| TAG_ID | FLASHCARD_ID |
+--------+--------------+
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
| 2 | 2 |
| 4 | 2 |
| 5 | 2 |
+--------+--------------+
6 rows in set (0.00 sec)
下面是另一个有效的查询。这个不使用子查询,这是我在Hibernate代码中使用的
select fc.FLASHCARD_ID,
fc.QUESTION,
fc.ANSWER
from FLASHCARD fc
inner join FLASHCARD_TAGS fc_t
on fc.FLASHCARD_ID=fc_t.FLASHCARD_ID
inner join TAG t
on fc_t.TAG_ID=t.TAG_ID
where t.Name in ('tag2', 'tag4')
group by fc.FLASHCARD_ID
having count(t.TAG_ID)=2
谢谢这很有效。我想知道有没有可能不使用Having子句就可以实现它?我们可以使用下面的查询吗?如果我做错了什么,请纠正我。从flashcards\u标记中选择flashId,其中标记\u id=2,然后退出从flashcards\u标记中选择flashId,其中标记\u id=4@Sandeep:您的子查询不相关。感谢您的回复,但我无法使此查询返回任何结果rows@Justin:那是因为一开始我弄错了,对不起。现在应该没问题了。
SELECT f.*
FROM flashcard f
INNER JOIN flashcard_tags ft1 ON f.FLASHCARD_ID = ft1.FLASHCARD_ID
INNER JOIN tag t1 ON ft1.TAG_ID = t1.TAG_ID AND t1.NAME = 'tag2'
INNER JOIN flashcard_tags ft2 ON f.FLASHCARD_ID = ft2.FLASHCARD_ID
INNER JOIN tag t2 ON ft2.TAG_ID = t2.TAG_ID AND t2.NAME = 'tag4'
select fc.FLASHCARD_ID,
fc.QUESTION,
fc.ANSWER
from FLASHCARD fc
inner join FLASHCARD_TAGS fc_t
on fc.FLASHCARD_ID=fc_t.FLASHCARD_ID
inner join TAG t
on fc_t.TAG_ID=t.TAG_ID
where t.Name in ('tag2', 'tag4')
group by fc.FLASHCARD_ID
having count(t.TAG_ID)=2