-4

我正在尝试选择与视频 id X 相关的 6 个相关视频。我在 SO 上查看了几个问题,但没有一个与我的系统与流派等匹配。我试图做的是制作一个,UNION SELECT但是一遍又一遍地列出相同的视频,所以我放弃了。

我现在有三个数据库。

视频- 包含所有可用视频的表格。 vID vName vCover

流派- 包含可用流派(动作、戏剧、惊悚片等)的表 gID gName

Genre_connections - 此表包含流派和视频之间的连接(thriller -> inception(但带有它们的 ID)) gcID gcVideoID gcGenreID

我想选择 6 个与提供的 ID 相关的视频。关系基于相似的流派。因此,如果我正在查看恐怖/惊悚电影,最相关的视频将是恐怖/惊悚电影,第二大相关视频将是恐怖惊悚电影。

基本上,关系应该基于具有相同流派的电影,按共同的总流派排序,降序排列。

如果可以包含名称之间的关系也不会太麻烦。因此,如果我正在查看钢铁侠,最热门的相关视频将是钢铁侠 2钢铁侠 3,然后是与类型相关的电影。

4

3 回答 3

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,您真的希望返回Dexter Laboratory吗?同样,在 name 的简单匹配中搜索Aliens也不会找到Alien

我建议您可能需要另一张桌子来连接一系列电影。

于 2014-02-20T11:29:04.677 回答
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 回答
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 回答