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 5

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, поэтому вы действительно не знаете, насколько важны жанры для каждого фильма. Этот запрос даст вам соответствующие фильмы по убыванию важности жанров в критериях:

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
Обратите внимание, что все фильмы, кроме 5, относятся ко всем 3 жанрам. Если вы добавите столбец в genre_rel, представляющий порядок важности, вы можете придумать некоторую математику (вес-важность или что-то подобное).

Вы можете сделать это следующим образом:

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