2016-09-20 3 views
2

SQL 쿼리가 발생했습니다. 나는 을 알고 무엇하지만 알아낼 수 없다 어떻게. 그래서, 여기에 필요한 제도입니다 :SQL 그룹화 쿼리

영화 (제목, 이사, 연도, 장르, 속도);

TITLE   DIRECTOR  YEAR  GENRE  RATE 
Fight club Fincher  1999  Action  4.5 
Vertigo  Hitchock  1958  Drama  5 
Donnie darko Kelly  2001  Thriller 3.5 

비디오 (표제, 이사, colloc);

TITLE   DIRECTOR COLLOC 
Fight club  Fincher  3877 
Fight club  Fincher  3878 
Vertigo  Hitchcock 5431 
Vertigo  Hitchcock 5432 
Donnie darko Kelly  9986 

임대 (colloc, dateRent, 고객, dateReturn);

목록, 적어도 두 번 임대 얼마나 많은 비디오 각 영화에 대한 : 여기

COLLOC DATERENT CUSTOMER DATERETURN 3877 2016-05-02 324 2016-05-04 3877 2016-05-20 365 2016-05-20 3878 2016-04-11 876 2016-04-12 3878 2016-06-06 112 2016-06-08 ... ... ... ... ... ... ... ... 9986 2016-02-24 443 2016-02-28 

그리고

는 쿼리입니다.

(참고 : 매장에는 일반적으로 영화마다 DVD, VHS 등이 더 많습니다.)

내 접근 방식은 다음과 같습니다

TITLE   DIRECTOR  VIDEOSNUMBER 
Fight club  Fincher  2 
Vertigo  Hitchcock  1 
Donnie darko Kelly   0 
이에 도착하기 위해

COLLOC TITLE   DIRECTOR RENTNUMBER 
3877  Fight club Fincher  2 
3878  Fight club Fincher  2 
5432  Vertigo  Hitchcock 2 
5431  Vertigo  Hitchcock 1 
9986  Donnie darko Kelly  1 

: 나는

SELECT colloc, title, director, COUNT(colloc) AS rentNumber 
FROM Rent 
NATURAL JOIN Video 
GROUP BY colloc 

이런 식으로 뭔가를 표시하려면이 간단한 쿼리로 시작하는 것입니다

하지만이 마지막 단계가 없어서 GROUP BY/HAVING을 적절하게 사용할 수 없습니다. 하위 쿼리를 사용하더라도 성공하지 못했습니다. 나는 다른 접근법을 사용하려고 노력했지만 아무런 도움이되지 않아서 어떤 조언도 감사 할 것입니다.

감사합니다.

편집 : 참고 : 쿼리에서 테이블 Movie를 사용할 필요가 없습니다. 저는 영화가 하나 이상의 비디오를 가질 수 있다는 것을 설명하기 위해 그곳에 넣었습니다. 표 예제를 추가했습니다. 기본 키는 굵게 표시됩니다.

해결 방법 : 팁 덕분에 해결책을 찾았습니다 (적어도 2 번 이상 대여 한 동영상이없는 모든 영화를 제공하므로 솔직히 부분적입니다). 어쨌든, 여기있다 :

SELECT title, director, COUNT(title) AS videosNumber 
FROM (SELECT colloc, title, director, COUNT(colloc) AS rentNumber 
     FROM rent NATURAL JOIN video 
     GROUP BY colloc 
    ) X 
WHERE rentNumber > 1 
GROUP BY title 
+0

내가 생각을 당신이해야 GROUP 규정에 의한 일반 GROUP 말한다 titolo – Kasnady

+0

BY : GROUP BY 절이 지정된 경우 SELECT 목록의 각 열 참조 중 하나를 식별해야합니다 그룹화 열 또는 집합 함수의 인수 일 수 있습니다! – jarlh

+1

지정된 예상 결과를 생성하여 샘플 테이블 데이터를 추가하십시오! – jarlh

답변

0

SELECT 
-- if you want to add colloc, uncomment below 
-- r.colloc as COLLOC 
m.title as TITLE, 
m.director as DIRECTOR, 
COUNT(r.colloc) as VIDEOSNUMBER 

FROM movie m 
LEFT JOIN video v ON m.title = v.title 
LEFT JOIN rent r ON v.colloc = r.colloc 
GROUP BY TITLE 
+2

GROUP BY가 잘못되었습니다. 최신 MySQL 버전에서는 오류가 발생합니다. (이전 버전에서는 임의의 결과를 반환합니다.) – jarlh

+0

최신 MySQL 버전의 오류와 무관하게 Nebi 및 @ unnikrishnan-r과 동일한 결과가 출력됩니다. – Zeno

+0

@Zeno에서 테이블 이름을 변경 했습니까? 오류를 보여 주실 수 있습니까? – Kasnady

0

그것을 테스트 해보십시오 :

SELECT m.TITLE, m.DIRECTOR, COALESCE(rs.Rentnumber, 0) AS VIDEOSNUMBER 
FROM Movie AS m 
LEFT JOIN 
(
    SELECT 
     --r.colloc, -- if you want to see r.colloc 
     v.TITLE, 
     v.DIRECTOR, 
     COUNT(v.TITLE) AS Rentnumber 
    FROM Video AS v 
    LEFT JOIN Rent as r on v.colloc = r.colloc 
    GROUP BY r.colloc, v.TITLE, v.DIRECTOR 
) AS rs ON m.title = rs.title AND m.director = rs.director 
Group by m.title, m.director 
+0

이것은 내가 시도한 해결책 중 하나 였지만 VIDEOSNUMBER에는 한 번 이상 임대 된 동영상의 수가 아닌 각 영화의 총 임대료 수가 포함됩니다. 동영상을 대여하지 않은 영화는 없습니다. – Zeno

+0

그룹에서 콜록 번호를 정말로 원하는 것보다 – Nebi

+0

@zeno가 쿼리를 업데이트했습니다. 그것을 테스트하지 않았습니다. 그것들은 MySQL의 더 깨끗한 솔루션 일 것입니다. SQL-SERVER에서 Window-Functions를 사용합니다. MySQL에서는'Group_concat'을 시도 할 수 있습니다. – Nebi

0

스크립트 아래 그와 함께하십시오. SELECT 목록의 열을 GROUP BY 절에 포함해야합니다.

SELECT TITLE,DIRECTOR,MIN(VIDEOSNUMBER) VIDEOSNUMBER 
FROM (
     SELECT v.colloc,v.TITLE,v.DIRECTOR ,COUNT(r.colloc) VIDEOSNUMBER  
     FROM Video v 
     LEFT JOIN Rent r on v.colloc=r.colloc 
     GROUP BY v.TITLE,v.DIRECTOR,v.colloc)t 
GROUP BY TITLE,DIRECTOR 
+0

@Nebi의 쿼리와 같은 결과를 출력합니다. – Zeno

+0

업데이트 된 쿼리로 시도하십시오 .. –

+0

정확한 결과가 아니지만 문제를 해결하는 올바른 방법이라고 생각합니다. from 절의 결과 테이블을 "중첩"합니다. 감사. – Zeno

1

이 쿼리를보십시오 :

SELECT t1.TITLE, 
     t1.DIRECTOR, 
     COALESCE(t2.VIDEOSNUMBER, 0) AS VIDEOSNUMBER 
FROM Movie t1 
LEFT JOIN 
(
    SELECT v.TITLE, COUNT(DISTINCT r.COLLOC) AS VIDEOSNUMBER 
    FROM Rent r 
    INNER JOIN Video v 
     ON r.COLLOC = v.COLLOC 
    GROUP BY v.TITLE 
) t2 
    ON t1.TITLE = t2.TITLE 
ORDER BY COALESCE(t2.VIDEOSNUMBER, 0) DESC