2011-05-10 111 views
2

我試圖敲掉我的SQL技能的鏽跡,並需要一些幫助以下查詢。我目前使用的數據庫是mysql。幫助查詢關係表

我想要檢索所有分配了'tag2'和'tag4'的FlashCards。根據現有表格的內容(如以下摘錄所示),查詢應返回兩行:FlashCard_ID 1和2.

我將如何制定此查詢?自從我必須做這樣的事情以來,這已經有一段時間了。

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) 

回答

2
SELECT f.* 
FROM (
     SELECT flashcard_id 
     FROM tags t 
     JOIN flashcard_tags ft 
     ON  ft.tag_id = t.tag_id 
     WHERE t.name IN ('tag2', 'tag4') 
     GROUP BY 
       flashcard_id 
     HAVING COUNT(*) = 2 
     ) ft 
JOIN flashcard f 
ON  f.flashcard_id = ft.flashcard_id 
+0

謝謝。這工作。我想知道是否有可能沒有Having條款呢? – Justin 2011-05-11 02:34:07

+0

我們可以使用下面的查詢嗎?如果我做錯了,請糾正我。 – Sandeep 2011-05-12 05:09:17

+0

「SELECT flashId FROM flashcards_tags WHERE tag_id = 2 AND EXISTS(SELECT flashId FROM flashcards_tags WHERE tag_id = 4)」 – Sandeep 2011-05-12 05:16:34

1
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' 
+0

感謝您的回覆,但我無法獲得此查詢返回任何行 – Justin 2011-05-11 12:21:08

+0

@Justin:那是因爲我一開始錯了,對不起。現在應該沒問題。 – 2011-05-11 12:27:46

0

這裏的另一個查詢工作。這個不使用子查詢,而是我最終在我的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