MySQL WHERE IN Query-ORDER BY Match
ОБНОВЛЕННЫЙ ВОПРОС
Привет,
Я пытаюсь перефразировать свой вопрос, потому что мой последний был не всем понятен.Это моя тестовая таблица
+----------+---------+-------+
|  rel_id  |  genre  | movie |
+----------+---------+-------+
|    1     |    1    |   3   |
|    2     |    8    |   3   |
|    3     |    3    |   3   |
|    4     |    2    |   5   |
|    5     |    8    |   5   |
|    6     |    3    |   5   |
|    7     |    1    |   8   |
|    8     |    8    |   8   |
|    9     |    3    |   8   |
|   10     |    5    |   9   |
|   11     |    7    |   9   |
|   12     |    9    |   9   |
|   13     |    4    |   9   |
|   14     |    12   |   9   |
|   15     |    1    |   10  |
|   16     |    8    |   10  |
|   17     |    3    |   10  |
|   18     |    5    |   10  |
|   19     |    1    |   11  |
|   20     |    2    |   11  |
|   21     |    8    |   11  |
|   22     |    5    |   11  |
|   23     |    3    |   11  |
+----------+---------+-------+
Результат должен быть в следующем порядке, если я ищу фильмы с жанром 1, 8, 3: Movie no. 3, 8, 10, 5, 11 (9 выходит).
Если это невозможно, то я просто хочу, чтобы все с точным соответствием "1, 8, 3", в этом случае я просто получил бы фильм № 3 и 8.
Спасибо!
5 ответов:
Если я правильно понял, вы хотите отсортировать результаты по количеству совпадений в порядке убывания. Для этого вы можете попробовать:
SELECT movie FROM genre_rel WHERE genre IN (1, 8, 3) GROUP BY movie order by count(movie) descИ если вы хотите фильмы, соответствующие всем критериям, вы можете использовать:
SELECT movie FROM genre_rel WHERE genre IN (1, 8, 3) GROUP BY movie HAVING count(movie) = 3Обновление:
Это лучшее, что я могу сделать в MySql. Вы не можете использовать IN, потому что вы не можете извлечь информацию о порядке фильтров. Если вы добавляете производную таблицу в качестве средства фильтрации, вы можете добавить эту информацию и использовать ее для отображения результатов по позиционным соответствиям. Обратите внимание, что вы не предоставляете никакой информации о заказе в таблице genre_rel, поэтому вы действительно не знаете, насколько важны жанры для каждого фильма. Этот запрос даст вам соответствующие фильмы по убыванию важности жанров в критериях:
Обратите внимание, что все фильмы, кроме 5, относятся ко всем 3 жанрам. Если вы добавите столбец в genre_rel, представляющий порядок важности, вы можете придумать некоторую математику (вес-важность или что-то подобное).SELECT movie FROM genre_rel INNER join ( select 1 genre, 1000 weight union all select 8, 100 union all select 3, 10 ) weights on genre_rel.genre = weights.genre GROUP BY movie order by sum(weight) desc
Вы можете сделать это следующим образом:
SELECT distinct movie FROM genre_rel WHERE genre IN (1, 8, 3);
Вы дали критерии по жанровой колонке. Если вы фильм 5 также содержат жанр 8 и 3 также. По этой причине вы также получаете фильм 5.
Как насчет чего-то вроде:
SELECT movie, SUM(gentre) AS count FROM genre_rel WHERE genre IN (1, 8, 3) GROUP BY movie ORDER BY count DESC
Попробуйте выполнить этот запрос -
SELECT movie FROM genre_rel GROUP BY movie ORDER BY IF(COUNT(IF(genre IN (1, 8, 3), 1, NULL)) = 3, genre, genre + 1000)Где 1000-смещение порядка для фильмов, которые не совпадают, увеличьте это значение, если вам нужно.
Кроме того, вы можете попробовать этот порядок по -
ORDER BY IF(COUNT(IF(genre IN (1, 8, 3), 1, NULL)) = 3, genre, MAX(genre))