2013-09-25 67 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