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 |

我只需要从每部电影中获取一个最近的预告片。但我得到了每部电影的所有预告片。请建议我得到SQL声明。

4

6 回答 6

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

如果您想通过预告片表的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 帖子中提到的操作。一旦你得到按movie_id划分的“等级”,你只需选择WHERE rank < 6. 查询可能会变得非常混乱,并且以这种方式使用变量存在一些风险,但据我所知,这是严格使用 MySQL 查询的最佳方法

于 2013-01-03T07:13:38.753 回答
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
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 回答