我的PHP表单中有一个文本框(我使用jQuery自动完成),用户可以在其中插入一个演员/女演员名称,然后点击"搜索"按钮,打开一个新窗口,显示该演员/女演员的电影列表。
这是一个查询,我按照演员姓名获取电影:
$query = $conn->prepare("SELECT DISTINCT c.movieName, c.castName, c.movieImdbId, f.year, f.posterLink FROM cast_movie as c JOIN film_info as f ON c.ImdbId = f.ImdbId WHERE c.castName = :q");
$query->execute(array(':q' => $searchText ));
如果用户从自动完成列表中选择一个名称,则上述查询可以正常工作。但是我想让用户写任何名字(即使他无法从自动完成列表中找到)。例如,如果用户写" tom"在文本框中,单击"搜索"按钮,我想显示所有演员的所有电影列表,他们的名字包含单词" tom"。
为此,我在上面的查询中使用了LIKE :q
和':q' => '%' . $searchText . '%'
,但查询永远不会结束!!(我认为因为cast_movie
是一个相当大的VIEW(带有300万行)并将此视图与另一个表连接需要很长时间(实际上我等了10分钟它还没有完成)。
有人可以告诉我是否有办法解决这个问题? (我读过我们可以使用索引来加入非常大的表,但我认为不可能为cast_movie
定义索引,因为它是VIEW。)
关于评论,为了提供更多信息:
cast_movie
是一个通过加入" movie_roleNames"和#34;电影"。
movie_roleNames
也是一个通过连接两个表格而制作的视图" Cast"和" nameRoles"。
film_info
也是一个通过加入两个表"电影"和" movies_info"。
上表的结构:
表&#34;电影&#34; : Id,movieName,ImdbId(电影的唯一ID),费率,numVotes,年(索引< / strong>: ImdbId,movieName,year )
表&#34;演员&#34; : castName,castImdbID(演员阵容的唯一ID)(索引: castName ,castImdbID )
表&#34; nameRoles&#34; : Id,castImdbId,movieImdbId,role_Id ,(索引: movieImdbId, castImdbId )
查看&#34; movie_roleNames&#34; : Id,castName,castImdbId,movieImdbId ,加入声明为:SELECT n.Id, c.castName, n.castImdbId, n.movieImdbId
FROM nameRoles as n
join Cast as c
ON n.castImdbId = c.castImdbID
查看&#34; cast_movie&#34; : Id,castName,castImdbId,movieImdbId,movieName ,加入声明为:SELECT m.Id, r.castName, r.castImdbId, r.movieImdbId, m.movieName
FROM movie_roleNames AS r
JOIN movies AS m
ON r.movieImdbId = m.ImdbId
所有想法都受到高度赞赏,