MySQL嵌套匹配与未返回任何结果



我想选择与

匹配的子集
SELECT * FROM (
                SELECT * FROM Movie WHERE 
                MATCH(keywords) AGAINST('$mk')
            )
            WHERE MATCH(genres) AGAINST('$mg')

$ mk可能是"动作,惊悚片"$关键字可能是"英雄,枪支,森林"

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

两个查询返回值。当我将匹配与查询与操作员相结合时,它也有效。

我想实现的是根据关键字从电影中获得一套通过匹配流派从此子集中获得一组。

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

问候

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

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

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')

这应该更快。根据情况,您可能需要使用非贴工表并管理缓存。

最后,我设法获得了结果,但仅在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-我将匹配的关键字与另一个临时table12-我从table1获得了与另一个临时table2的匹配类型3-我从table2

获得匹配导演作为列表

它在phpmyadmin中的SQL查询测试中起作用,但

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

什么都不会做..?!?我认为这是一个PHP问题,但是有人可以告诉什么问题。

regrads

终于我对此进行了管理。创建了3个临时表,与匹配项选择不同的选择结合这些临时表和分数总和从最终临时表中选择顶级匹配:)

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

$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);

相关内容

  • 没有找到相关文章

最新更新