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临时表,而是需要自己管理表清理