2014-02-16 3 views
-4

동영상 ID X와 관련된 6 개의 관련 동영상을 선택하려고합니다. 여기에서 몇 가지 질문을 살펴 보았지만 장르 등의 내 시스템에는 일치하지 않습니다. 내가 시도한 것은 UNION SELECT을 만드는 것이었지만 동일한 비디오를 반복해서 계속 나열하므로 계속 포기했습니다.동영상 ID와 관련된 동영상 가져 오기 X

저는 현재 세 개의 데이터베이스가 있습니다.

비디오 - 사용 가능한 모든 비디오가 포함 된 표. vID vName vCover

장르 - 가능한 장르 (액션, 드라마, 스릴러 등) gID gName

genre_connections 을 포함하는 테이블 -이 테이블은 장르와 비디오 사이의 연결을 포함 (스릴러 -> 개설 (신분증 포함)) gcID gcVideoID gcGenreID

제공된 ID와 관련된 6 개의 비디오를 선택하고 싶습니다. 관계는 비슷한 장르를 기반으로합니다. 따라서 공포/스릴러 영화를 검토하면 가장 관련있는 비디오는 공포/스릴러 영화가되며 두 번째로 가장 관련있는 비디오는 공포가됩니다 또는 스릴러 영화.

기본적으로 관계는 전체 장르로 정렬 된 동일한 장르의 영화를 기준으로 내려야합니다.

포함 할 수 있다면 이름 사이의 관계를별로 번거롭게 만들지도 좋을 것입니다. 내가 아이언 맨을 검토하고있어 경우에 따라서 상단 관련 동영상은아이언 맨 2 아이언 맨 3 것하고 장르 관련 영화가 따를 것입니다.

+0

질문에 충분한 정보가 없으므로 답변을 드릴 수 없습니다. 관련성을 의미하고 db에서이 논리가 어떻게 정의됩니까? – Mihai

+0

내가 질문에 썼 듯이 : _Relations는 유사한 장르를 기반으로합니다. 그래서 내가 공포/스릴러 영화를 검토한다면 가장 관련있는 비디오는 공포/스릴러 영화가 될 것이며 두 번째로 가장 관련있는 비디오는 공포 ** 또는 스릴러 영화가 될 것입니다 ._ :) @Mihai ** Edit : * * 기본적으로 관계는 전체 장르로 정렬 된 동일한 장르의 영화를 기준으로 내려야합니다. –

답변

1

가 (실제 테스트 데이터) 테스트 없지만 질문의 첫 번째 부분은 아마 이런 단일 쿼리와 함께 할 수 없음 : -

2의 경우
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 

, 유사한 이름에 일치하는, 내가 얼마나 쓸모 있을지 모르겠다. 예를 들어, 을 검색하는 경우 덱스터을 정말로 원하십니까 덱스터 실험실이 반환됩니까? 마찬가지로 을 (를) 검색하면 이름이 단순한 일치 항목 인 인 경우 외국인 인을 찾을 수 없습니다.

필자는 일련의 영화를 연결하기 위해 다른 테이블이 필요할 것이라고 제안합니다.

+0

검색 상자에 Dexters Laboratory를 보여주는 것이 유용하다고 생각합니다. – androbin

+0

아마도 검색 창 (아마도 일반적인 맞춤법 오류 등)에 대처하기를 원할 것입니다. 그러나 가장 비슷한 6 가지 항목을 나열하면 그 이름이 그처럼 유용하지 않을 가능성이 높습니다. 보기에 어느 것을 결정할 것인가에 대한 범주의 일치와 관련하여 막연하게 비슷한 이름을 어떻게 비교할 것인가? – Kickstart

0

비디오와 유전자 사이에 SQL 조인을 만듭니다. 여기에 당신이 그것을 http://www.w3schools.com/sql/sql_join.asp

을 할 수있는 방법이며, 다음 사용은 비디오를 첫 번째 쿼리는 vID의를 얻기위한이

SELECT * FROM Videos WHERE Title LIKE '%IronMan'; 
1

같은 http://www.w3schools.com/sql/sql_like.asp

조회에 볼 수있는 작품을 선택하려면 필름 Ironman. 원하는 경우 vID를 사용할 수 있습니다.

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

편집 : temp

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

하자 별칭이이 장르의 동영상을 요청하는 쿼리에 조인 두 번째로

당신은 그것의 genreID이 필요합니다.당신은 단지 노동 조합을 필요 결국

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

및 제한 추가 :이 이름에 관련된 영화를해야하는 경우

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%') 
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

관련 문제