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))