2014-02-16 4 views
-4

Я пытаюсь выбрать 6 связанных видеороликов, связанных с видео id X. Я просмотрел несколько вопросов здесь о SO, но ни одна из них не соответствует моей системе жанрами и т. Д. То, что я пытался сделать, это сделать UNION SELECT, но он продолжал перечислять одно и то же видео снова и снова, поэтому я сдался.Получить видеоролики, связанные с видео id X

У меня есть три базы данных, которые сейчас находятся вне сущности.

видео - Таблица, содержащая все доступные видео. vID vName vCover

жанры - таблица, содержащая доступные жанры (действие, драма, триллер и т.д.) gID gName

genre_connections - Эта таблица содержит связь между жанром и видео (триллер -> начало (но с их идентификаторами)) gcID gcVideoID gcGenreID

Я хочу выбрать 6 видео, связанных с прилагаемым ID. Отношения основаны на аналогичных жанрах. Поэтому, если я просмотрю фильм ужасов/триллеров, самым связанным видео будет фильм ужасов/триллеров, а вторым самым связанным с ним видео будет ужас или фильм триллера.

В основном отношения должны быть основаны на фильмах с теми же жанрами, которые упорядочены по общим жанрам, по убыванию.

Если можно включить, то не будет слишком сложно связывать отношения между именами. Так что если я пересматриваю Iron Man, то высшие связанные видео будут Iron Man 2 и Iron Man 3, а затем последуют жанровые фильмы.

+0

Недостаточно информации в вашем вопросе, чтобы дать ответ. Что это значит, связанный и как эта логика определена в вашем db? – Mihai

+0

Как я писал в вопросе: _Relations основаны на аналогичных жанрах. Поэтому, если я просмотрю фильм ужасов и триллеров, самым связанным с ним видео будет фильм ужасов/триллеров, а второе наиболее связанное видео будет ужасным ** или ** фильмом триллера. _ :) @Mihai ** Редактировать: * * В принципе отношения должны быть основаны на фильмах с теми же жанрами, которые упорядочены по общим жанрам, по убыванию. –

ответ

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 

Для 2-й части, чтобы совпасть с похожими названиями, Я не уверен, насколько это возможно. Например, если вы ищете Dexter Вы действительно хотите Лабораторная лаборатория? Аналогичным образом в поиске Aliens на простой матч по названию не найдено Alien.

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

+0

Я думаю, что в поисковой системе полезно показать Dexters Laboratory. – androbin

+0

Возможно, в окне поиска (в этом случае вы, вероятно, захотите справиться с обычными орфографическими ошибками и т. Д.), Но при просто перечислении 6 наиболее похожих элементов имена слишком вероятны, чтобы быть несвязанными, чтобы быть полезными. Добавлено к тому, как было бы сравниваться смутно подобным именем для соответствия матчи по категориям, чтобы решить, какой из них показать? – Kickstart

1

Первый запрос для получения vID из пленка Ironman. Вы можете использовать vID, если хотите.

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

EDIT:

Как Второму вам нужно его 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; 

Я проверить его и запустить правильно.

+0

В одном из двух последних запросов я получаю сообщение об ошибке (из 'mysql_error'), которое выглядит так: * Не уникальная таблица/псевдоним: 'genre_connections' *. Спасибо за ответ, хотя! –

+0

Я изменил код, пожалуйста, протестируйте его, это сработало для меня. – androbin

Смежные вопросы