我有一个带有电影的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]的
这种方法有用,但是当我们谈论一个拥有成千上万条记录的数据库时,需要花费太多时间。
那么,有什么建议吗?谢谢!
答案 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);