Mysql 嵌套匹配不返回任何结果

Mysql nested match against not returning any results

我想 select 子集匹配

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

$mk 可能是 "action,thriller" $keywords 可以是 "hero,guns,forest"

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

两者都查询 return 个值。 当我将针对查询的匹配与 AND 运算符结合使用时,它也有效。

我想实现的是根据关键字从电影中获取一组然后 从该子集中获得一组具有匹配流派的集合。如果可能的话,这将继续进行更多键。

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

此致

您当前方法的索引性能会非常差。

相反,创建一个临时的 table,为其编制索引,并根据其全文。

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

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

最后我设法得到了结果,但只能在 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 问题,但有人能告诉我哪里出了问题吗?

注册

我终于搞定了.. 创建了 3 个临时 tables,其中不同的选择由 MATCH AGAINST 选择 UNION 这些 temp tables 通过 id 和分数的总和 Select 最终温度的最佳匹配项 table :))

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

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