LEFT JOINed表的SQL限制

时间:2013-01-03 06:57:11

标签: mysql select group-by left-join

我有以下表格。

  1. 行业(身份证,姓名)
  2. 电影(id,name,industry_id)[行业有很多电影]
  3. 预告片(id,name,movie_id)[电影有很多预告片]
  4. 我需要为每个行业找到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声明。

6 个答案:

答案 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
相关问题