我有以下表格。
我需要为每个行业找到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
声明。
答案 0 :(得分:1)
要获取最近的预告片,您应该包含我们可以从中获取的日期字段列
答案 1 :(得分:1)
我不确定这是否适用于MySql,因为我无法记住您是否可以在in子句中包含子查询,但您可以尝试:
select * from trailer
where id in (select max(id) from trailer group by movie_id)
无论是否有效,您似乎都没有在查询中使用行业表格,因此加入该行业并没有太大意义(除非您实际上是在尝试排除不要播放的电影&# 39;没有任何行业分配给他们......但根据你的样本我看起来并不像你的意图。
如果上述查询在MySql中无效,请尝试使用
select t.*
from trailer t join
(select max(id) id from trailer group by movie_id) t2 on t1.id = t2.id
答案 2 :(得分: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
OR 如果您希望按日期更新数据,请使用此查询:
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
答案 3 :(得分:1)
如果你必须在SQL中完成所有操作(而不是你正在使用的任何后端或代码,我实际上会推荐),那么你可能不得不依赖一些变量魔法。
基本上,您需要按日期对每个预告片进行“排名”,然后根据预告片所属的电影对其进行“分区”。这些单词在SQL的其他一些版本(例如PL/SQL)中具有实际意义,但遗憾的是在MySQL中没有本机功能。
你会想做类似this SO post中提到的事情。一旦你获得了由movie_id划分的“排名”,你只需选择WHERE rank < 6
即可。查询可能会变得非常混乱,并且以这种方式使用变量存在一些风险,但从我可以看出,这是使用MySQL查询严格执行此操作的最佳方法
答案 4 :(得分: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;
以下是Demo
答案 5 :(得分: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