web-dev-qa-db-ja.com

MySQL WHEREINクエリ-ORDERBY 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の映画を探すと、結果は次のようになります。 3、8、10、5、11(9が出ています)。

それが不可能な場合は、「1、8、3」と完全に一致するすべてのものが必要です。その場合は、映画番号を取得します。 3および8。

6
richie

私が正しく理解している場合は、一致数の降順で結果を並べ替えます。これを行うには、次のことを試してください。

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に追加すると、いくつかの数学(重み-重要度など)を考案する場合があります。

10

これは、次の方法で実行できます。

SELECT distinct movie FROM genre_rel WHERE genre IN (1, 8, 3);
2
user1082916

あなたはジャンルの列にIn基準を与えました。映画5の場合、ジャンル8と3も含まれています。そのため、映画5も入手できます。

0
kandarp

次のようなものはどうですか?

SELECT movie, SUM(gentre) AS count 
  FROM genre_rel 
  WHERE genre IN (1, 8, 3) 
  GROUP BY movie 
  ORDER BY count DESC
0
Tomasz Machura

このクエリを試してください-

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が一致しない映画の注文オフセットである場合、必要に応じてこの値を増やします。

また、このORDERBYを試すこともできます-

ORDER BY IF(COUNT(IF(genre IN (1, 8, 3), 1, NULL)) = 3, genre, MAX(genre))
0
Devart