2012-01-04 4 views
1

В настоящее время я пытаюсь обновить свою поисковую машину, чтобы использовать несколько слов. Он очень большой и сложный, но я сталкиваюсь с ошибками, с которыми я раньше не сталкивался, и я понятия не имею, почему.Огромный sql-запрос, возвращающий ошибку (mysql)

поэтому вопрос в том, почему я получаю ошибку ниже?

Я собираюсь разделить это на разные разделы для лучшего понимания.

Это только SQL запрос, который я echo d, скопировать и вставить в PHPMyAdmin, наклеенные здесь (PHPMyAdmin отформатирован это красиво) Она ищет 2-х слов в базе:

SELECT * 
FROM (

SELECT p.page_url AS url, COUNT(*) AS occurrences 
FROM PAGE p, word w, occurrence o 
WHERE (
(
p.page_id = o.page_id 
AND w.page_word_id = o.page_word_id 
AND w.word_word LIKE '%' 'test' '%' 
GROUP BY p.page_id 
) 
OR (
p.page_id = o.page_id 
AND w.page_word_id = o.page_word_id 
AND w.word_word LIKE '%' 'search' '%' 
GROUP BY p.page_id 
) 
UNION (

SELECT f.file_url AS url, COUNT(*) AS occurrences 
FROM files f, filenames fn, fileoccurrence fo 
WHERE f.file_id = fo.file_id 
AND fn.file_word_id = fo.file_word_id 
AND fn.file_word LIKE '%' 'test' '%' 
GROUP BY f.file_id 
) 
OR (

SELECT f.file_url AS url, COUNT(*) AS occurrences 
FROM files f, filenames fn, fileoccurrence fo 
WHERE f.file_id = fo.file_id 
AND fn.file_word_id = fo.file_word_id 
AND fn.file_word LIKE '%' 'search' '%' 
GROUP BY f.file_id 
) 
)t 
ORDER BY occurrences DESC 

Этот код производится это PHP код ниже, который использует функцию взрываются от поискового ввода

// Do a little formatting 
$keyword = strtolower($keyword); 

// Get timestamp for start 
$start_time = microtime(true); 

$searched_words = explode(' ', $keyword); 

foreach ($searched_words as $index => $word) { 
    // Set up the stemmer 
    $stemmer = new PorterStemmer; 
    $stemmed_string = $stemmer->stem($word); 
    $searched_words[$index] = $stemmed_string; 
} 

// Configure the sql code 
$sql = "SELECT * FROM (SELECT p.page_url AS url, COUNT(*) AS occurrences 
    FROM page p, word w, occurrence o WHERE ("; 

// Add the extra words to the sql 
foreach ($searched_words as $index => $word) { 
    $sql .= "(p.page_id = o.page_id AND w.page_word_id = o.page_word_id 
     AND w.word_word LIKE '%' '" . $word . "' '%' GROUP BY p.page_id) OR"; 
} 
// Add the union to the sql and then add the second query 
$sql = substr($sql, 0, (strLen($sql)-3)); //this will eat the last OR 
$sql .= " UNION "; 

// The second set of querys 
foreach ($searched_words as $index => $word) { 
    $sql .= "(SELECT f.file_url AS url, COUNT(*) AS occurrences FROM files f, filenames fn, fileoccurrence fo 
     WHERE f.file_id = fo.file_id AND fn.file_word_id = fo.file_word_id AND fn.file_word 
     LIKE '%' '" . $word . "' '%' GROUP BY f.file_id) OR"; 
} 

// Clsoe the sql code 
$sql = substr($sql, 0, (strLen($sql)-3)); //this will eat the last OR 
$sql .= ") t ORDER BY occurrences DESC"; // LIMIT " . $results . ""); 

// echo the query for the pure lolz of it 
echo $sql . "<br /><br />"; 

// Search the DB for the results 
$results = mysql_query($sql) 
    or die("Invalid query: " . mysql_error()); 

Все это возвращает ошибку:

Invalid query: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY p.page_id) OR(p.page_id = o.page_id AND w.page_word_id = o.page_word_id' at line 3

Почему я получаю эту ошибку? Код, который я использовал ранее, работал нормально. Единственное, что я добавил, это foreach().

Это мой исходный код SQL:

$result = mysql_query("SELECT * FROM (SELECT p.page_url AS url, COUNT(*) AS occurrences 
    FROM page p, word w, occurrence o WHERE p.page_id = o.page_id AND w.page_word_id = o.page_word_id 
    AND w.word_word LIKE '%' '" . $stemmed_string . "' '%' GROUP BY p.page_id UNION 
    SELECT f.file_url AS url, COUNT(*) AS occurrences FROM files f, filenames fn, fileoccurrence fo 
    WHERE f.file_id = fo.file_id AND fn.file_word_id = fo.file_word_id AND fn.file_word 
    LIKE '%' '" . $stemmed_string . "' '%' GROUP BY f.file_id) t ORDER BY occurrences DESC") // LIMIT " . $results . "") 
     or die("Invalid query: " . mysql_error()); 

EDIT: Исправлена ​​ошибка выше. с этим кодом

// Configure the sql code 
$sql = "SELECT * FROM (SELECT p.page_url AS url, COUNT(*) AS occurrences 
    FROM page p, word w, occurrence o WHERE ("; 

// Add the extra words to the sql 
foreach ($searched_words as $index => $word) { 
    $sql .= "(p.page_id = o.page_id AND w.page_word_id = o.page_word_id 
     AND w.word_word LIKE CONCAT('%', '" . $word . "', '%'))) OR "; //GROUP BY p.page_id) 
} 
// Add the union to the sql and then add the second query 
$sql = substr($sql, 0, (strLen($sql)-4)); //this will eat the last OR 
$sql .= " GROUP BY p.page_id)"; 
$sql .= " UNION "; 
$sql .= "(SELECT f.file_url AS url, COUNT(*) AS occurrences FROM files f, filenames fn, fileoccurrence fo 
    WHERE ("; 

// The second set of querys 
foreach ($searched_words as $index => $word) { 
    $sql .= "(f.file_id = fo.file_id AND fn.file_word_id = fo.file_word_id AND fn.file_word 
     LIKE CONCAT('%', '" . $word . "', '%'))) OR "; //GROUP BY f.file_id) 
} 

// Clsoe the sql code 
$sql = substr($sql, 0, (strLen($sql)-4)); //this will eat the last OR 
$sql .= " GROUP BY f.file_id)"; 
$sql .= ") t ORDER BY occurrences DESC"; // LIMIT " . $results . ""); 

Это теперь производит ошибку:

Invalid query: Every derived table must have its own alias

, который имеет что-то делать с профсоюзами (я не очень хорошо союзами .. или SQL в целом)

ответ

4

Вы не можете конкатенировать строки в SQL, просто разместив их рядом друг с другом.

AND w.word_word LIKE '%' 'test' '%' 

Должно быть

AND w.word_word LIKE CONCAT('%', 'test', '%') 

Или, если вы используете SET SQL_MODE='PIPES_AS_CONCAT', чтобы получить стандартный ANSI синтаксис SQL, вы можете использовать:

AND w.word_word LIKE '%' || 'test' || '%' 

Re ваш комментарий, я вижу еще одну проблему :

В SQL, предложение WHERE должно быть завершено, прежде чем вы сможете добавить предложение GROUP BY. Синтаксис:

WHERE (<conditions...>) 
GROUP BY <expressions> 

В то время как у вас есть:

WHERE (<conditions...> GROUP BY <expressions>) 
    OR (<conditions...> GROUP BY <expressions>) 

То, что вы не правовой синтаксис.

Действительно, это то, что вы должны уметь искать в любой новинке на SQL.


Every derived table must have its own alias

Это означает, что вы использовали подзапрос в предложении FROM, но не дал ему псевдоним. Например:

SELECT ... FROM (SELECT ... FROM table) AS x WHERE ...etc... 

Если оставить вне AS x то это ошибка (х является лишь примером в этом случае, вы можете выбрать более значимый псевдоним).

0

В вашем сгенерированном SQL скобки не совпадают ... есть 9 '(' s и 8 ')' s.

Вы также забыли комментарий LIMIT " . $results . ""); как часть вашего последнего смены кода?

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