2010-10-27 69 views
1

好吧我最近進入正常化我的數據庫爲這個我已經創建了一段時間的小項目,但我剛剛撞到一堵磚牆。我會試着給出一個可以理解的例子,說明我有什麼和我需要做什麼 - 並希望它不會太痛苦。好。MySQL高級選擇幫助

我有3代表的第一個,我們將調用顯示,結構是這樣的:

+----+--------------------------+ 
| id | title     | 
+----+--------------------------+ 
| 1 | Example #1    | 
| 2 | Example #2    | 
| 3 | Example #3    | 
+----+--------------------------+ 

簡單明瞭。

我的下一個表名爲類別,lookes這樣的:

+----+--------------------------+ 
| id | category     | 
+----+--------------------------+ 
| 1 | Comedy     | 
| 2 | Drama     | 
| 3 | Action     | 
+----+--------------------------+ 

而且最終的表稱爲Show_categories:

+---------+---------+ 
| show_id | cat_id | 
+---------+---------+ 
| 1  |  1 | 
| 1  |  3 | 
| 2  |  2 | 
| 2  |  3 | 
| 3  |  1 | 
| 3  |  2 | 
+---------+---------+ 

正如你可能已經注意到這個問題是在我的數據庫單演可以有多個類別。一切都結構良好,除了我找不到爲什麼要搜索具有多個類別的節目這一事實。

如果我要搜索動作和喜劇類型的節目,我會給出示例1,但這是不可能的(至少在我的查詢中),因爲Show_categories中的cat_id在不同的行中。工作單分類檢索

例(選擇所有喜劇節目):

SELECT s.id,s.title 
    FROM Shows s JOIN Show_categories sc ON sc.anid=s.id 
    WHERE sc.cat_id=1 GROUP BY s.id 

和查詢那是不可能的(因爲CAT_ID不能等於2個不同的東西):

SELECT s.id,s.title 
    FROM Shows s JOIN Show_categories sc ON sc.anid=s.id 
    WHERE sc.cat_id=1 AND sc.cat_id=2 GROUP BY s.id 

所以總結一下我所問的是如何處理一個查詢,我正在尋找基於多個匹配類別的節目。

回答

4

用途:

SELECT s.id, 
     s.title 
    FROM SHOWS s 
    JOIN SHOW_CATEGORIES sc ON sc.anid = s.id 
    WHERE sc.cat_id IN (1, 2) 
GROUP BY s.id, s.title 
    HAVING COUNT(DISTINCT sc.cat_id) = 2 

COUNT(DISTINCT sc.cat_id)比較需求等於IN子句中列出的cat_id值的數量。但是,如果SHOW_CATEGORIES show_idcat_id列都是主鍵,或者兩列都有唯一約束 - 那麼您可以使用COUNT(sc.cat_id)

+0

如果數據庫設置不正確並且在「show_categories」表中允許兩次記錄相同的記錄,則可能會失敗 – cambraca 2010-10-27 01:34:31

+0

@cambraca:否 - 如果有重複的機會,我解釋了COUNT DISTINCT的必要性。 – 2010-10-27 01:35:49

+0

這就是我如何設置的,查詢工作完美。 – ahoka 2010-10-27 01:38:41

0

您需要一個OR語句。

SELECT s.id,s.title 
    FROM Shows s JOIN Show_categories sc ON sc.anid=s.id 
    WHERE sc.cat_id=1 OR sc.cat_id=2 GROUP BY s.id 

也就是說,你希望所有的節目有任何CATID 1或2 CATID所以這個查詢將返回1,2和3

+0

如果一個節目有兩個關聯到cat_id「1」但沒有關聯到cat_id「2」會怎麼樣? – 2010-10-27 01:30:06

+1

如果數據庫已正確標準化,則它不應與catid 1有2個關聯。沒有理由說兩次演出屬於喜劇類別。 – 2010-10-27 01:31:30

+0

這將返回顯示是OR,我需要匹配cat_id = 1和cat_id = 2的顯示。 – ahoka 2010-10-27 01:32:49