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);
我想 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);