MySQL WHERE IN Query - ORDER BY Match - PullRequest
       20

MySQL WHERE IN Query - ORDER BY Match

6 голосов
/ 21 марта 2012

ОБНОВЛЕННЫЙ ВОПРОС

Здравствуйте,

Я пытаюсь перефразировать мой вопрос, потому что мой последний был не всем понятен.

Это моя тестовая таблица

+----------+---------+-------+
|  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: Фильм №.3, 8, 10, 5, 11 (9 отсутствует).

Если это невозможно, то я просто хочу, чтобы все с точным соответствием "1, 8, 3", в таком случае я бы просто получилфильм №3 И 8.

Спасибо!

Ответы [ 5 ]

9 голосов
/ 21 марта 2012

Если я правильно понимаю, вы хотите отсортировать результаты по количеству совпадений в порядке убывания.Для этого вы можете попробовать:

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

2 голосов
/ 21 марта 2012

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

SELECT distinct movie FROM genre_rel WHERE genre IN (1, 8, 3);
0 голосов
/ 21 марта 2012

Попробуйте этот запрос -

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))
0 голосов
/ 21 марта 2012

Как насчет чего-то вроде:

SELECT movie, SUM(gentre) AS count 
  FROM genre_rel 
  WHERE genre IN (1, 8, 3) 
  GROUP BY movie 
  ORDER BY count DESC
0 голосов
/ 21 марта 2012

Вы дали критерии в колонке жанра. Если ваш фильм 5 также содержит жанр 8 и 3 также. По этой причине вы получаете и фильм 5.

...