2013-09-25 121 views
-1

,比如我有表和值:複雜的mysql選擇查詢7

CREATE TABLE IF NOT EXISTS `words` (
    `wd_id` int(11) NOT NULL, 
    `st_id` int(11) NOT NULL, 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

---------------------------- 
| wd_id | st_id | 
---------------------------- 
|  2  |  4  | 
---------------------------- 
|  5  |  4  | 
---------------------------- 
|  7  |  8  | 
---------------------------- 
|  2  |  8  | 
---------------------------- 
|  7  |  9  | 
---------------------------- 
|  2  |  10  | 
---------------------------- 
|  5  |  10  | 
---------------------------- 

wd_id是字
st_id的ID是一句

的ID,如果我知道的兩個詞ID。我想獲得有這句話的句子列表。 例如,這個ID是2和5,那麼ANSWER將是4和10.

在這張表中將是數以萬計的行。所以我需要仔細寫查詢!

這裏查詢我寫道:

SELECT st_id 
    FROM words 
    WHERE wd_id = 5 AND st_id IN (
     SELECT st_id 
     FROM words 
     WHERE wd_id = 2 
    ) 

有人可以寫更好的查詢?或查詢哪些將工作N個詞?
如果我爲wd_id和st_id列添加索引這個查詢會更快是嗎?
什麼類型的指數會好?

+0

是的,你應該添加索引到你正在使用你的「WHERE」條件的任何字段。在數據集開始增長時,您不會注意到速度增加,因爲執行全表掃描的成本很低,而記錄數很少。 –

回答

0
SELECT st_id 
FROM words 
WHERE wd_ID IN (2, 5) 
GROUP BY st_id 
HAVING COUNT(DISTINCT wd_ID) = 2 

如果wd_ID是每一個st_id獨一無二的,你不需要有having子句中DISTINCT

HAVING COUNT(*) = 2 

你可以閱讀更多的此鏈接,

+0

謝謝! 你能否說明這部分HAVING COUNT(DISTINCT wd_ID)= 2 以及如何查詢N個單詞? – Guno

+0

查詢過濾了所有'st_id',它具有* w_ID的* 5或'2'值。然後,它會對st_id進行分組,並僅過濾具有值爲2的記錄,*聚合行*的結果,因爲您正在'st_id'中搜索兩個值。 [SQLFiddle演示](http://sqlfiddle.com/#!2/0f338/9) –

+0

關於N WORLY的內容?你能給我個想法嗎? – Guno