2010-06-07 2 views
0

Я хочу добавить предложение WHERE в запрос полного текстового поиска (чтобы ограничить 24 часа), но везде, где я его вставляю, я получаю Low Level Ошибка. Можно ли добавить предложение, и если да, то как? Вот код без оговорки, где:MySQL - Как вставить дополнительное предложение 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; 
+1

Не могли бы вы, возможно, добавить переносами там? Трудно читать, как есть. – Wrikken

+0

И между предложением WHERE & HAVING, которое я предполагаю ... – Wrikken

+0

Можете ли вы уточнить, где вы пытаетесь вставить выражение 'WHERE' и какую ошибку вы получаете? – VeeArr

ответ

0

Похоже, у вас есть два 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 
+0

Нет, не работает, но спасибо – Steven

5

Во-первых, некоторые советы о вопросах:

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

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

Теперь о запросе:

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

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

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

  • MySQL полный текст поиска в boolean mode не возвращает релевантность. Вы должны использовать natural language mode, чтобы получить значение релевантности между 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"; 
+2

Можете ли вы дать более подробную информацию о том, что« тоже не работает »? Трудно что-то предложить. Можете ли вы отредактировать свой вопрос выше и добавить точный запрос, который вы выполняете (после того, как весь код PHP его создал) и точное сообщение об ошибке? Также некоторые детали, такие как версия MySQL и то, как вы выполняете запрос с PHP. –

Смежные вопросы