Mysql高级SELECT,还是多个SELECTS?电影关键字

时间:2010-06-16 18:53:06

标签: mysql database join keyword optimization

我有一个带有电影的mysql数据库如下:

  

MOVIES(ID,标题)

     

KEYWORDS_TABLE(id,key_id)[id is   引用movies.id,key_id是   参考keywords.id]

     

KEYWORDS(id,keyword)//这与我的例子无关。

基本上我每部都有他们的标题和情节关键词的电影,我想选择所有具有相同关键字并且具有给定电影ID的电影。

我尝试过类似的事情:

  

SELECT key_id FROM keywords_table   WHERE id = 9

     

在php中执行此操作并存储所有内容   数组中的ID $ key_id ..然后我构建   另一个选择看起来像:

     

选择movies.title FROM   电影,keywords_table WHERE   keywords_table.key_id = $ key_id [1]或   keywords_table.key_id = $ key_id [2]或   ......... 要么   keywords_table.key_id = $ KEY_ID [n]的

这种方法有用,但是当我们谈论一个拥有成千上万条记录的数据库时,需要花费太多时间。

那么,有什么建议吗?谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

尝试使用'in'关键字,而不是构建大量的布尔操作。

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

答案 2 :(得分:0)

使用子选择:

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