-4

ビデオ ID X に関連する 6 つの関連ビデオを選択しようとしています。SO に関するいくつかの質問に目を通しましたが、私のシステムとジャンルなどに一致するものはありません。私がやろうとしたことはUNION SELECT、同じビデオを何度もリストし続けたので、あきらめました。

現在、本質から外れているデータベースが 3 つあります。

videos - 利用可能なすべての動画を含むテーブル。 vID vName vCover

ジャンル- 利用可能なジャンル (アクション、ドラマ、スリラーなど) を含むテーブル gID gName

ジャンル_接続 - このテーブルには、ジャンルとビデオの間の接続が含まれています (スリラー -> 始まり (ただし ID 付き)) gcID gcVideoID gcGenreID

提供された ID に関連する 6 つの動画を選択したいと考えています。関係は同様のジャンルに基づいています。したがって、ホラー/スリラー映画をレビューしている場合、最も関連性の高いビデオはホラー/スリラー映画で、2 番目に関連性の高いビデオはホラーまたはスリラー映画になります。

基本的に、関係は同じジャンルの映画に基づいており、全ジャンルが共通で降順になっている必要があります。

含めることができれば、名前間の関係も問題ありません。したがって、Iron Manをレビューしている場合、上位の関連ビデオはIron Man 2Iron Man 3で、その後にジャンル関連の映画が続きます。

4

3 に答える 3

1

最初のクエリはvID、映画のを取得するためのものIronmanです。必要に応じて vID を使用できます。

SELECT `vID` FROM `videos` WHERE `vName` = 'Ironman';

編集:

Secondとして、そのgenreIDが必要です:

SELECT `gcGenreID`
FROM `genre_connections`
INNER JOIN `videos`
ON `videos`.`vID` = `genre_connections`.`gcVideoID`
WHERE `videos`.`vName` = 'Ironman';

tempというエイリアスを付けて、このジャンルのビデオを要求するクエリに結合しましょう。

SELECT `vID`,`vName`,`vCover`
FROM `videos`
INNER JOIN `genre_connections`
ON `videos`.`vID` = `genre_connections`.`gcVideoID`
INNER JOIN (SELECT `gcGenreID` FROM `genre_connections` INNER JOIN `videos` ON `videos`.`vID` = `genre_connections`.`gcVideoID` WHERE `videos`.`vName` = 'Ironman') `temp`
ON `temp`.`gcGenreID` = `genre_connections`.`gcGenreID`;

この名前に関連する映画が必要な場合は、次を使用できます。

SELECT `vID`,`vName`,`vCover`
FROM `videos`
WHERE `vName` LIKE '%Ironman%';

最後に、それらを結合して制限を追加するだけです。

(SELECT `vID`,`vName`,`vCover`
FROM `videos`
WHERE `vName` LIKE '%Ironman%')
UNION
(SELECT `vID`,`vName`,`vCover`
FROM `videos`
INNER JOIN `genre_connections`
ON `videos`.`vID` = `genre_connections`.`gcVideoID`
INNER JOIN (SELECT `gcGenreID` FROM `genre_connections` INNER JOIN `videos` ON `videos`.`vID` = `genre_connections`.`gcVideoID` WHERE `videos`.`vName` = 'Ironman') `temp`
ON `temp`.`gcGenreID` = `genre_connections`.`gcGenreID`)
LIMIT 6;

私はそれをテストし、正しく実行しました。

于 2014-02-19T13:21:37.463 に答える
1

テストされていません(実際のテストデータはありません)が、質問の最初の部分はおそらく次のような単一のクエリで実行できます:-

SELECT d.vID, d.vName, GROUP_CONCAT(e.gName) AS SharedGenre, COUNT(*) AS SharedGenreCount
FROM videos a
INNER JOIN genre_connections b
ON a.vID = b.gcVideoID
INNER JOIN genre_connections c
ON b.gcGenreID = c.gcGenreID
AND b.gcVideoID != c.gcVideoID
INNER JOIN videos d
ON c.gcVideoID = d.vID
INNER JOIN genres e
ON c.gcGenreID = e.gID
WHERE a.vName = 'Iron Man'
GROUP BY d.vID, d.vName
ORDER BY SharedGenreCount DESC
LIMIT 6

第二弾は、似たような名前でマッチングするため、どこまで使えるかわかりません。たとえば、Dexterを検索した場合、 Dexters Laboratoryが返されることを本当に望んでいますか? 同様に、名前の単純な一致でAliensを検索しても、 Alienは見つかりません。

一連の映画をリンクするには、別のテーブルが必要になる可能性があることをお勧めします。

于 2014-02-20T11:29:04.677 に答える
0

ビデオとジャンル間の SQL 結合を作成します。これを行う方法は次のとおりです http://www.w3schools.com/sql/sql_join.asp

like を使用してビデオ http://www.w3schools.com/sql/sql_like.aspを選択します。

あなたのクエリは次のようになります

SELECT * FROM Videos WHERE Title LIKE '%IronMan';
于 2014-02-18T22:53:15.753 に答える