MySQL - Как мне вставить дополнительное предложение where в этот полнотекстовый поиск - PullRequest
0 голосов
/ 07 июня 2010

Я хочу добавить предложение WHERE к полнотекстовому поисковому запросу (до последних 24 часов), но куда бы я ни вставил его, я получаю сообщение Low Level Error. Можно ли добавить предложение и если да, то как? Вот код без предложения where:

        $query = "SELECT *, MATCH (story_title) AGAINST ('$query' IN BOOLEAN MODE) 
AS Relevance FROM stories WHERE MATCH (story_title) AGAINST ('+$query' IN BOOLEAN MODE)
 HAVING Relevance > 0.2 ORDER BY Relevance DESC, story_time DESC;

Ответы [ 2 ]

5 голосов
/ 08 июня 2010

Сначала несколько советов о том, как задавать вопросы:

  • Использовать разрывы строк. PHP поддерживает строковые литералы с переносами строк, в отличие от некоторых языков, таких как Java. Форматирование SQL упрощает чтение, отладку и обслуживание.

  • Показать SQL. Вы добавили расширение PHP-переменной в этот запрос, что не имеет отношения к вашему вопросу. Это только усложняет людям расшифровку того, что вы пытаетесь спросить. Покажите код, который вы хотите отладить, а не код, который генерирует код.

Теперь о вашем запросе:

  • Вы не можете просто добавить дополнительную фразу WHERE в любом месте. Добавьте дополнительные условия к существующему предложению WHERE с оператором AND.

  • Встраивание вызова для проверки одного и того же параметра $_GET несколько раз в одном запросе кажется расточительным. Используйте переменную, чтобы сохранить результат проверки параметра.

  • Воспользуйтесь оценкой короткого замыкания . Поместите условия, которые являются наименее дорогостоящими для оценки (например, те, которые получают выгоду от обычного индекса) слева.

  • Полнотекстовый поиск MySQL в логическом режиме не возвращает релевантность. Вы должны использовать режим естественного языка , чтобы получить значение релевантности от 0 до 1.

  • Размещение условий в предложении HAVING вместо предложения WHERE упрощает задачу, поскольку вы можете использовать псевдонимы столбцов, определенные вами в списке SELECT, но это может ухудшить выполнение запроса. HAVING - для включения условий в группы после условия GROUP BY. WHERE - для помещения условий в строки для включения в результат запроса.

  • Строки автоматически сортируются в порядке актуальности, если вы используете MATCH() в режиме естественного языка в предложении WHERE. Если вероятность ничьей невелика, вы можете пропустить предложение ORDER BY и сделать запрос еще более эффективным.

Вот как бы я написал этот код:

$q = validate_input($_GET["q"]);
$bsearch = $pdo->quote("+{$q}");
$nlsearch = $pdo->quote($q);
$stories_table = $config["db"]["pre"] . "stories";
$offset = validate_input(($_GET["page"]-1)*10);

$query = "
  SELECT *, MATCH (story_title) AGAINST ({$nlsearch}) AS Relevance 
  FROM {$stories_table} 
  WHERE story_time > time()-86400
    AND MATCH (story_title) AGAINST ({$bsearch} IN BOOLEAN MODE) 
    AND MATCH (story_title) AGAINST ({$nlsearch}) > 0.2
  LIMIT {$offset}, 10";
0 голосов
/ 07 июня 2010

Похоже, у вас есть два WHERE предложения:

SELECT * 
WHERE story_time > time()-86400 
AND MATCH (story_title) AGAINST ('".validate_input($_GET['q'])."' IN BOOLEAN MODE) 
AS Relevance 
FROM ".$config['db']['pre']."stories 
WHERE MATCH (story_title) AGAINST ('+".validate_input($_GET['q'])."' IN BOOLEAN MODE) 
HAVING Relevance > 0.2 
ORDER BY Relevance DESC, story_time DESC LIMIT 

Должно быть что-то вроде этого:

SELECT *, MATCH (story_title) AGAINST ('".validate_input($_GET['q'])."' IN BOOLEAN MODE) 
AS Relevance 
FROM ".$config['db']['pre']."stories 
WHERE MATCH (story_title) AGAINST ('+".validate_input($_GET['q'])."' IN BOOLEAN MODE) 
HAVING Relevance > 0.2 
AND story_type > time() - 86400
ORDER BY Relevance DESC, story_time DESC LIMIT 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...