私は私の質問を言い換えようとしています、なぜなら私の最後の質問は誰にとっても明確ではなかったからです。
これは私のテストテーブルです
+----------+---------+-------+
| 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。
私が正しく理解している場合は、一致数の降順で結果を並べ替えます。これを行うには、次のことを試してください。
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);
あなたはジャンルの列にIn基準を与えました。映画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が一致しない映画の注文オフセットである場合、必要に応じてこの値を増やします。
また、このORDERBYを試すこともできます-
ORDER BY IF(COUNT(IF(genre IN (1, 8, 3), 1, NULL)) = 3, genre, MAX(genre))