5

次のテーブルがあります。

  1. 業種(ID、名前)
  2. Movie(id, name, industry_id) [映画が多い業界]
  3. Trailer(id, name, movie_id) [映画にはたくさんの予告編があります]

各業界の 6 つの最新予告編を見つける必要があります。すべての映画に予告編が必要なわけではなく、複数の [0-n] を持つことができます。

CREATE TABLE industry(id int, name char(10), PRIMARY KEY (id));

CREATE TABLE movie(id int, name char(10), industry_id int, PRIMARY KEY (id),
FOREIGN KEY (industry_id) REFERENCES industry(id));

CREATE TABLE trailer(id int, name char(10), movie_id int, PRIMARY KEY (id),
FOREIGN KEY (movie_id) REFERENCES movie(id));

INSERT INTO industry VALUES (1, "sandalwood");
INSERT INTO industry VALUES (2, "kollywood");

INSERT INTO movie VALUES (1, "lakshmi", 1);
INSERT INTO movie VALUES (2, "saarathi", 2);

INSERT INTO trailer VALUES (1, "lakshmi1", 1);
INSERT INTO trailer VALUES (2, "lakshmi2", 1);
INSERT INTO trailer VALUES (3, "lakshmi3", 1);
INSERT INTO trailer VALUES (4, "lakshmi4", 1);
INSERT INTO trailer VALUES (5, "lakshmi5", 1);
INSERT INTO trailer VALUES (6, "lakshmi6", 1);

INSERT INTO trailer VALUES (7, "saarathi4", 2);
INSERT INTO trailer VALUES (8, "saarathi5", 2);
INSERT INTO trailer VALUES (9, "saarathi6", 2);

SELECT  c.*
FROM    industry a
        LEFT JOIN movie b
            ON a.id = b.industry_id
        LEFT JOIN trailer c
            ON b.id = c.movie_id
LIMIT 0, 6

| ID |     NAME | MOVIE_ID |
----------------------------
|  1 | lakshmi1 |        1 |
|  2 | lakshmi2 |        1 |
|  3 | lakshmi3 |        1 |
|  4 | lakshmi4 |        1 |
|  5 | lakshmi5 |        1 |
|  6 | lakshmi6 |        1 |

各映画から最近の予告編を 1 つだけ取得する必要があります。しかし、私は各映画のすべての予告編を取得しています. SQLステートメントを取得するように提案してください。

4

6 に答える 6

1

このクエリを試してください

SELECT * FROM industry
LEFT JOIN movie on movie.industry_id = industry.id
LEFT JOIN (
  SELECT 
  id as T_ID,
  name as T_Name,
  movie_id
  FROM trailer 
  INNER JOIN ( SELECT 
              MAX(id) as TID
              FROM trailer
              GROUP BY movie_id
             ) as t on t.TID = trailer.id
) as c on c.movie_id = movie.id;

これがデモです

于 2013-01-03T07:17:38.777 に答える
1

最近の予告編を取得するには、取得できる日付フィールド列を含める必要があります

于 2013-01-03T07:03:57.037 に答える
1

これが MySql で機能するかどうかはわかりません。なぜなら、in 句内でサブクエリを使用できるかどうか思い出せないためです。

select * from trailer
where id in (select max(id) from trailer group by movie_id)

機能するかどうかに関係なく、クエリで業界テーブルを使用していないように見えるため、それに参加してもあまり意味がありません (業界が割り当てられていない映画を実際に除外しようとしている場合を除きます.. .しかし、あなたのサンプルに基づくと、それはあなたの意図ではないようです)。

上記のクエリが MySql で機能しない場合は、これを試してください

select  t.* 
from    trailer t join
        (select max(id) id from trailer group by movie_id) t2 on t1.id = t2.id
于 2013-01-03T07:06:13.437 に答える
1
SELECT i.name, m.name, MAX(t.id) AS 'Latest Trailer ID', MAX(t.name) AS 'Latest Trailer'    
FROM industry i
INNER JOIN movie m ON(i.id = m.industry_id)
INNER JOIN trailer t ON(m.id = movie_id)
GROUP BY m.id
于 2013-01-05T15:04:53.420 に答える
1

トレーラーテーブルのIDで最新のトレーラーが必要な場合は、以下のクエリを使用します。

SELECT * FROM trailer t 
INNER JOIN (SELECT movie_id, MAX(id) id 
            FROM trailer GROUP BY movie_id) AS A ON t.id = A.id 

または、日付ごとに最新のデータが必要な場合は、次のクエリを使用します。

SELECT * FROM trailer t 
INNER JOIN (SELECT movie_id, MAX(latestbydate) latestbydate 
            FROM trailer GROUP BY movie_id
           ) AS A ON t.movie_id = A.movie_id  AND t.latestbydate = A.latestbydate
于 2013-01-03T07:12:33.513 に答える
1

これをすべて SQL で行う必要がある場合 (実際に使用しているバックエンドやコードではなく、実際にお勧めします)、おそらく何らかの変数マジックに頼らなければならないでしょう。

基本的に、各予告編を日付で「ランク付け」してから、予告編が属する映画で「分割」する必要があります。これらの単語は、SQL の他のフレーバー ( PL/SQLなど) では実際の意味を持ちますが、残念ながら、MySQL にはネイティブ機能がありません。

この SO postで言及されているものと同様のことをしたいと思うでしょう。movie_id で区切られた「ランク」を取得したら、 を選択するだけWHERE rank < 6です。クエリはかなり厄介になる可能性があり、そのように変数を使用することにはリスクがありますが、MySQL クエリで厳密に行うにはこれが最善の方法であると言えます。

于 2013-01-03T07:13:38.753 に答える