计算来自IN运算符的匹配单词

时间:2015-05-13 07:01:44

标签: mysql

我有这个小mysql查询:

select t.title FROM title t
inner join movie_keyword mk on mk.movie_id = t.id
inner join keyword k on k.id = mk.keyword_id
where k.keyword IN ( 
select k.keyword 
FROM title t
inner join movie_keyword mk on mk.movie_id = t.id
inner join keyword k on k.id = mk.keyword_id
where t.id = 166282 
) 
LIMIT 15

正如您所看到的,它将返回title中至少有一个相同关键字且ID为166282的电影的所有标题。

现在我有问题,因为我还要计算在IN运算符中匹配了多少个关键字(假设我只想看到有3个或更多相同关键字的标题),我尝试使用聚合函数,但一切都失败了,所以我带着问题来到这里。也许有人可以给我一些建议或代码示例。

我不确定,如果这种“子查询方式”是好的,那么如果有更好的选择我应该如何解决我的问题,我愿意接受任何建议或提示。

谢谢!

@Edit

所以经过一些问题,我还有一个问题。这是我目前的查询:

SELECT s.title,s.vote,s.rating,count(dk.key) as keywordCnt, count(dg.name) as genreCnt 

FROM series s 

INNER JOIN series_has_genre shg ON shg.series_id = s.id 
INNER JOIN dict_genre dg ON dg.id = shg.dict_genre_id

INNER JOIN series_has_keyword shk ON shk.series_id = s.id
INNER JOIN dict_keyword dk ON dk.id = shk.dict_keyword_id
WHERE dk.key IN (

SELECT dki.key FROM series si 
INNER JOIN series_has_keyword shki ON shki.series_id = si.id
INNER JOIN dict_keyword dki ON dki.id = shki.dict_keyword_id
WHERE si.title LIKE 'The Wire'

)

and dg.name IN (

SELECT dgo.name FROM series so 
INNER JOIN series_has_genre shgo ON shgo.series_id = so.id 
INNER JOIN dict_genre dgo ON dgo.id = shgo.dict_genre_id
WHERE so.title LIKE 'The Wire'

) 
and s.production_year > 2000
GROUP BY s.title
ORDER BY s.vote DESC, keywordCnt DESC ,s.rating DESC, genreCnt DESC
LIMIT 5

问题是,它非常,非常非常慢。我应该改变什么提示,更快地运行它?

1 个答案:

答案 0 :(得分:0)

这对你有用吗?

select t.title, count(k.keyword) as keywordCount FROM title t
inner join movie_keyword mk on mk.movie_id = t.id
inner join keyword k on k.id = mk.keyword_id
where k.keyword IN ( 
    select ki.keyword 
    FROM title ti
    inner join movie_keyword mki on mki.movie_id = ti.id
    inner join keyword ki on ki.id = mki.keyword_id
    where ti.id = 166282 
) group by t.title 
LIMIT 15

请注意,我更改了嵌套查询中的表名,以避免混淆。