2010-06-16 51 views
1

我有一個MySQL數據庫與電影如下:Mysql高級SELECT或多個SELECTS?電影關鍵字

MOVIES(ID,標題)

KEYWORDS_TABLE(ID,KEY_ID)。[ID被 參考movies.id,KEY_ID是 refernced到keywords.id]

關鍵字(ID,關鍵詞)//這並不在我的例子沒關係..

基本上我有電影與他們的頭銜並繪製每個關鍵字,我想選擇與給定電影ID具有相同關鍵字的所有電影。

我想是這樣的:

SELECT KEY_ID FROM keywords_table WHERE ID = 9

做,在PHP和存儲陣列中的$ KEY_ID所有 的ID ..然後我建立 另一選擇看起來像:

SELECT movies.title FROM 電影,keywords_table WHERE keywords_table.key_id = $ KEY_ID [1]或 keywords_table.key_id = $ KEY_ID [2]或 ......... OR keywords_table.key_id = $ KEY_ID [N]

這有點兒工作,但它需要我們說話太多時間關於一個有成千上萬條記錄的數據庫。

那麼,有什麼建議?謝謝!

回答

3

你可以改善的一件事...而不是寫x = a OR x = b OR x = c你可以縮短到這個:x IN (a, b, c)

SELECT movies.title 
FROM movies,keywords_table 
WHERE keywords_table.key_id IN ($key_id[1], $key_id[2], ..., $key_id[n]) 

還要注意,您在查詢中缺少連接條件。您目前正在進行CROSS JOIN,也稱爲笛卡爾產品。我想你想要這樣的:

SELECT movies.title 
FROM movies 
JOIN keywords_table 
ON movies.id = keywords_table.id 
WHERE keywords_table.key_id IN ($key_id[1], $key_id[2], ..., $key_id[n]) 

這種查詢可以返回更多的同一部電影不止一次,所以你可能要添加DISTINCT以便移除重複的。你也可以做整個事情在一個查詢,而不是兩個爲進一步優化:

SELECT DISTINCT M.title 
FROM keywords_table K1 
JOIN keywords_table K2 
ON K2.key_id = K1.key_id 
JOIN movies M 
ON K2.id = M.id 
WHERE K1.id = 4 

關於性能,請確保您有主鍵設置爲(id)movies(key_id, id)keywords_table

+0

加入可能是更有效的...之後2100個記錄在另一個問題也不會失敗。 – MvanGeest 2010-06-16 18:57:11

+0

我並不是說這兩個操作都可以用一個查詢替換爲多個'JOIN' – MvanGeest 2010-06-16 19:01:16

+2

這就是爲什麼使用隱式連接不好的原因。這是一個未被注意到的交叉連接。使用隱式聯接是一個不好的做法。很高興看到您使用顯式語法,而不是僅僅修復隱式語法來刪除交叉連接。 – HLGEM 2010-06-16 19:06:40

0

嘗試使用'in'關鍵字而不是構建大量布爾操作。

SELECT movies.title FROM movies WHERE keyword_table.key_id IN ($key_id[1],..,$key_id[n]) 
0

使用子查詢:

 
SELECT DISTINCT m.title 
FROM movies m 
WHERE id IN (
    SELECT id 
    FROM keywords_table 
    WHERE id = 9); 
+0

我想你錯過了一個加入。 – 2010-06-16 19:22:48

+0

或兩個。或五。 :) – MvanGeest 2010-06-16 19:47:36

+0

是的。沒有正確地閱讀這個問題。:( – stephenr 2010-06-17 09:05:11