Mysql вложенный матч против не возвращает никаких результатов

Я хотел выбрать подмножества с сопоставлением с

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

$ mk может быть «боевик, триллер» $ ключевыми словами может быть «герой, оружие, лес»

Это не похоже на работу, или я могу что-то не так делать ..

Оба запроса возвращают значения.
Когда я комбинирую сопоставление запросов с оператором AND, это также работает.

я пытаюсь добиться, чтобы получить набор из фильмов в соответствии с ключевыми словами, то
получить набор из этого подмножества с совпадающими жанрами .. и, если возможно, это будет продолжаться еще для некоторых ключей ..

Или есть лучшее, более быстрое, более модульное решение для этого?
У меня возникают трудности с пониманием соединений, я думаю, что они могут быть лучшим решением, но я не знаю ..

С уважением

2

Решение

Производительность индексации вашего текущего метода будет исключительно низкой.

Вместо этого создайте временную таблицу, индексируйте ее и полный текст к ней.

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

И это должно работать быстрее. В зависимости от ситуации вы можете использовать временные таблицы и управлять их кэшированием.

0

Другие решения

В конце концов мне удалось получить результаты, но только в 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- Я получаю подходящие жанры для другой временной таблицы 2 из таблицы 1
3- Я получаю соответствующих директоров в виде списка из таблицы 2

Работает в тесте SQL-запроса в phpMyadmin НО

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

Не буду ничего делать ..?!? теперь я думаю, что это вопрос PHP, но кто-нибудь может сказать, что не так?

Regrads

0

Наконец-то мне это удалось ..
Создано 3 временных таблицы с различными вариантами выбора, выбранными MATCH AGAINST
ОБЪЕДИНИТЬ эти временные таблицы по идентификатору и сумме баллов
Выберите лучшие совпадения из финальной таблицы времен :))

Вот код и спасибо всем, кто помог ..

$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);
0
По вопросам рекламы [email protected]