2

我想选择匹配的子集

SELECT * FROM (
                SELECT * FROM Movie WHERE 
                MATCH(keywords) AGAINST('$mk')
            )
            WHERE MATCH(genres) AGAINST('$mg')

$mk 可能是“动作、惊悚片” $keywords 可能是“英雄、枪支、森林”

这似乎不起作用,或者我可能做错了什么..

两个查询都返回值。当我将匹配查询与 AND 运算符结合起来时,它也可以工作。

我试图实现的是根据关键字从电影中获取一组,然后从该子集中获取一组具有匹配类型的集合..如果可能的话,这将继续使用更多键..

或者有没有更好、更快、更模块化的解决方案?我很难理解加入我认为它们可能是一个更好的解决方案,但我不知道..

问候

4

3 回答 3

0

您当前方法的索引性能将异常差。

相反,创建一个临时表、索引该表和全文。

CREATE TEMPORARY TABLE `temp_movie`    
SELECT * FROM Movie WHERE 
                MATCH(keywords) AGAINST('$mk');

ALTER TABLE `temp_movie` ADD FULLTEXT INDEX(genres);

SELECT * FROM `temp_movie`
            WHERE MATCH(genres) AGAINST('$mg')

这应该执行得更快。根据具体情况,您可能希望使用非临时表并管理缓存它们。

于 2015-05-02T14:10:50.143 回答
0

最后我设法得到了结果,但只能在 phpMyAdmin 中看到;

示例代码如下

CREATE TEMPORARY TABLE `temp_movie` ENGINE=MyISAM
    SELECT * FROM Movie WHERE MATCH(keywords) AGAINST('$mk');
        ALTER TABLE `temp_movie` ADD FULLTEXT INDEX(genres);
CREATE TEMPORARY TABLE `temp_movie2` ENGINE=MyISAM
    SELECT * FROM `temp_movie` WHERE MATCH(genres) AGAINST('$mg');
        ALTER TABLE `temp_movie2` ADD FULLTEXT INDEX(director);
    SELECT * FROM `temp_movie2` WHERE MATCH(director) AGAINST('$md');

1- 我将匹配关键字与另一个临时表 1 2- 我从表 1 中获得与另一个临时表 2 匹配的流派 3- 我从表 2 中将匹配的导演作为列表获取

它适用于 phpMyadmin 但是的 SQL 查询测试

  if($result = $conn->query($simquery)){
    while($similar_movie = $result->fetch_assoc()) {
    echo $similar_movie["original_title"]."<br>";
    echo "test";
    }
} 

不会做任何事.. ?!? 现在我认为这是一个 PHP 问题,但谁能告诉我有什么问题..?

研究生

于 2015-05-02T16:09:31.903 回答
0

最后我管理了这个.. 创建了 3 个临时表,这些临时表由 MATCH AGAINST UNION 选择了不同的选择,这些临时表按 id 和分数总和从最终临时表中选择最高匹配项:))

这是代码,感谢所有帮助过的人..

$simquery = "
create temporary table t1
SELECT *, MATCH(keywords) AGAINST('$mk') as score from Movie ORDER BY score DESC;
";
$simquery2 = "
create temporary table t2
SELECT *, MATCH(genres) AGAINST('$mg') as score from Movie ORDER BY score DESC;
";
$simquery3 = "
create temporary table t3
SELECT *, MATCH(overview) AGAINST('$mo') as score from Movie ORDER BY score DESC;
";
$simfinal = "
SELECT *, sum(score) FROM 
(
 SELECT * FROM t1
 UNION 
 SELECT * FROM t2
 UNION 
 SELECT * FROM t3
) as tmp
WHERE tmdb_id != ".$id." GROUP BY id ORDER BY score DESC  LIMIT 30;
";

$conn2->query($simquery);
$conn2->query($simquery2);
$conn2->query($simquery3);

$result = $conn2->query($simfinal);
于 2015-05-06T09:16:35.643 回答