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

Php Mysql嵌套匹配不返回任何结果,php,mysql,select,subquery,match-against,Php,Mysql,Select,Subquery,Match Against,我想选择与匹配的子集 SELECT * FROM ( SELECT * FROM Movie WHERE MATCH(keywords) AGAINST('$mk') ) WHERE MATCH(genres) AGAINST('$mg') $mk可能是动作片,惊悚片 $关键字可能是英雄、枪支、森林 那似乎不管用,否则我可能会做错什么 两个查询都返回值。 当我使用AND运算符组合匹

我想选择与匹配的子集

SELECT * FROM (
                SELECT * FROM Movie WHERE 
                MATCH(keywords) AGAINST('$mk')
            )
            WHERE MATCH(genres) AGAINST('$mg')
$mk可能是动作片,惊悚片 $关键字可能是英雄、枪支、森林

那似乎不管用,否则我可能会做错什么

两个查询都返回值。 当我使用AND运算符组合匹配查询时,它也可以工作

我想做的是根据关键词从电影中获得一套 从该子集获取具有匹配类型的集合。。如果可能的话,还会有更多的钥匙

还是有更好、更快、更模块化的解决方案? 我在理解连接方面有困难,我认为它们可能是更好的解决方案,但我不知道


关于

当前方法的索引性能将非常差

相反,创建一个临时表,索引该表,并针对该表创建全文

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-我得到与另一个临时表匹配的关键字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个临时表,其中包含通过匹配选择的不同选项 按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);

尝试对内部select语句使用别名,如中所示:?当我添加别名时,它返回1191-找不到与列列表匹配的全文索引我猜这一次它失去了索引X1214-使用的表类型不支持全文索引temp_movie不是myISAM我猜它在添加ENGINE=myISAM时工作,但这次它给出了error@kutlus视情况而定在您的MySQL版本上。您也可以使用常规表而不是临时表,但之后需要将其清理干净。@kutlus在PHP中遇到的问题是,临时表只会持续连接的时间,所以您需要在同一个连接上完成这些操作,或者不使用MySQL临时表,而是需要自己管理表清理