2016-09-20 23 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 

賃料(collocdateRent、顧客、dateReturn)。

リスト、少なくとも2倍を借りたどのように多くの動画を各映画のために:

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など)があります。

私のアプローチは以下の通りである。これに到達するためには

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 

TITLE   DIRECTOR  VIDEOSNUMBER 
Fight club  Fincher  2 
Vertigo  Hitchcock  1 
Donnie darko Kelly   0 
私はこのような何かを表示するには、この単純なクエリ

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

で開始します

しかし、この最後のステップがないので、GROUP BY/HAVINGを適切に使用することができません。 サブクエリでも成功しません。 私は別のアプローチを使用しようとしてきましたが、何も得意ではなかったので、ヒントをいただければ幸いです。

ありがとうございました。

編集:注:クエリでテーブルムービーを使用する必要はありません。私は映画が複数のビデオを持つことができることを説明するためにそこに置いています。 テーブルの例を追加しました。主キーは太字で示しています。

解決策: あなたのヒントのおかげで、私は解決策を見つけました(少なくとも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思いtitolo – Kasnady

+0

BYルールBY一般GROUPは言う: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

これは私が試した解決策の1つでしたが、VIDEOSNUMBERには1回以上レンタルされたビデオの数ではなく、各映画の合計レンタル数が含まれます。 さらに、レンタルされていない動画はありません。 – 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 
関連する問題