MySQL: разве это не должно возвращать больше строк? - PullRequest
2 голосов
/ 29 июля 2011

Я выполняю простой LIKE-поиск по таблице, но не могу получить более одного результата по какой-то причине. В приведенном ниже примере запроса я включаю слова «никогда не сдавайся» и «душа серфера», но я получаю только один из фильмов. У меня есть эти фильмы в моей базе данных, наряду со многими другими.

Вот запрос:

SELECT movies . * , GROUP_CONCAT( categories.name ) AS categories, GROUP_CONCAT( categories.id ) AS categories_id
FROM movies
LEFT JOIN movies_categories ON ( movies.id = movies_categories.movie_id ) 
LEFT JOIN categories ON ( movies_categories.category_id = categories.id ) 
WHERE movies.movie_title LIKE  '%surfer%'
OR movies.movie_title LIKE  '%date%'
OR movies.movie_title LIKE  '%never%'
OR movies.movie_title LIKE  '%back%'
OR movies.movie_title LIKE  '%down%'
OR movies.movie_title LIKE  '%surfer%'
OR movies.movie_title LIKE  '%soul%'
OR movies.movie_title LIKE  '%the%'
OR movies.movie_title LIKE  '%transporter%'
LIMIT 0 , 30

Я думал, что с запросом должно быть что-то не так, иначе он вернет все результаты? Я знаю, что некоторые слова дублируются в подобных пунктах, но это не должно иметь значения. Я что-то пропустил?


Исправлено!

Функции group_concat (), которые я использовал, заставляли запрос возвращать только один результат и объединяли category и category_id для всех фильмов. Я только что удалил group_concat () и теперь он работает.

1 Ответ

4 голосов
/ 29 июля 2011

Вы используете GROUP_CONCAT, который является агрегатной функцией и объединяет ваши результаты в одну.

Добавьте предложение GROUP BY:

SELECT movies . * , GROUP_CONCAT( categories.name ) AS categories, GROUP_CONCAT( categories.id ) AS categories_id
FROM movies
LEFT JOIN movies_categories ON ( movies.id = movies_categories.movie_id ) 
LEFT JOIN categories ON ( movies_categories.category_id = categories.id ) 
WHERE movies.movie_title LIKE  '%surfer%'
OR movies.movie_title LIKE  '%date%'
OR movies.movie_title LIKE  '%never%'
OR movies.movie_title LIKE  '%back%'
OR movies.movie_title LIKE  '%down%'
OR movies.movie_title LIKE  '%surfer%'
OR movies.movie_title LIKE  '%soul%'
OR movies.movie_title LIKE  '%the%'
OR movies.movie_title LIKE  '%transporter%'
GROUP BY
        movies.id
LIMIT 0 , 30

Кроме того, если ваш moviesТаблица MyISAM, вы можете запустить это:

SELECT  movies.*,
        GROUP_CONCAT(categories.name) AS categories,
        GROUP_CONCAT(categories.id) AS categories_id
FROM    movies
LEFT JOIN
        movies_categories
ON      movies_categories.movie_id = movies.id
LEFT JOIN
        categories
ON      categories.id = movies_categories.category_id 
WHERE   MATCH(movie_title) AGAINST ("never back down" IN BOOLEAN MODE)
GROUP BY
        movies.id
LIMIT  0, 30

Этот запрос будет выполняться намного быстрее, если вы создадите индекс FULLTEXT:

CREATE FULLTEXT INDEX fx_movies_title ON movies (movie_title)
...