使用max()获取多行

时间:2017-06-12 04:51:29

标签: mysql max multiple-tables

我写了下面的查询,它给出了结果集 -

select
    a.character_name,
    b.planet_name,
    sum(b.departure - b.arrival) AS screen_time
from characters a
inner join timetable b
    on a.character_name = b.character_name
group by a.character_name, b.planet_name;

结果集:

Character_name | planet_name | Screen_time
C-3 PO       Bespin         4
C-3 PO       Hoth           2
C-3 PO       Tatooine       4
Chewbacca    Bespin         4
Chewbacca    Endor          5
Chewbacca    Hoth           2
Chewbacca    Tatooine       4

现在,如何选择具有max(screen_time)的每个字符的planet_name和character_name。 对于前者, 对于C-3 PO,要显示两行

C-3 PO | Bespin
C-3 PO | Tattoine

对于Chewbacca,要显示一行

Chewbacca | Endor

我面临的问题是因为我无法将条件实施到中间表。

2 个答案:

答案 0 :(得分:1)

编辑(删除我之前的回答)

您也可以使用HAVING子句中的相关子查询实现相同的目标:

select
    a.character_name,
    b.planet_name,
    sum(b.departure - b.arrival) as screen_time
from characters a
inner join timetable b
    on a.character_name = b.character_name
group by a.character_name, b.planet_name
having sum(b.departure - b.arrival) = (
    select 
        max(tmp.screen_time)
    from (
        select b.character_name, sum(b.departure - b.arrival) as screen_time
        from timetable b
        group by b.character_name, b.planet_name) tmp
    where a.character_name = tmp.character_name
    group by tmp.character_name);

鉴于您的问题,我不确定您是要检索screen_time还是character_nameplanet_name。如果您只想要最后两列,请从主查询中删除sum(b.departure - b.arrival) as screen_time

select
    a.character_name,
    b.planet_name
from characters a
inner join timetable b
    on a.character_name = b.character_name
group by a.character_name, b.planet_name
having sum(b.departure - b.arrival) = (
    select 
        max(tmp.screen_time)
    from (
        select b.character_name, sum(b.departure - b.arrival) as screen_time
        from timetable b
        group by b.character_name, b.planet_name) tmp
    where a.character_name = tmp.character_name
    group by tmp.character_name);   

PS:我以前的答案没有用。对不起。

答案 1 :(得分:1)

select character_name, planet_name
from (

    select
        a.character_name,
        b.planet_name,
        sum(b.departure - b.arrival) AS screen_time
    from characters a
    inner join timetable b
        on a.character_name = b.character_name
    group by a.character_name, b.planet_name

) sq
where screen_time = (SELECT MAX(ssq.screen_time) FROM (

    select
        a.character_name,
        b.planet_name,
        sum(b.departure - b.arrival) AS screen_time
    from characters a
    inner join timetable b
        on a.character_name = b.character_name
    group by a.character_name, b.planet_name

) ssq WHERE ssq.character_name = sq.character_name 
);

但不要担心,性能不应该像它最初看起来那么糟糕。 MySQL通常足够聪明,不能两次执行相同的查询。

还有其他方法可以实现同样的目标。如果您愿意,也可以尝试这些:The Rows Holding the Group-wise Maximum of a Certain Column