MySQL查找最繁忙的两条装运线,源端口和目标端口可切换

MySQL查找最繁忙的两条装运线,源端口和目标端口可切换,mysql,Mysql,这张桌子的结构很简单 create table t_hr_ship (shipment_id int, shipper_id int, source_port varchar(20), destination_port varchar(20)); 问题是:找到前3条最繁忙的线路并打印这些最繁忙线路的两个端口。对于两个装运,一个是从A到B,另一个是从B到A,它们在同一条线上(在相同的两个目的地之间),所以它们的装运应该加在一起 我正在考虑创建一个新的列“l

这张桌子的结构很简单

create table t_hr_ship 
    (shipment_id int,
     shipper_id int,
     source_port varchar(20),
     destination_port varchar(20));
问题是:找到前3条最繁忙的线路并打印这些最繁忙线路的两个端口。对于两个装运,一个是从A到B,另一个是从B到A,它们在同一条线上(在相同的两个目的地之间),所以它们的装运应该加在一起


我正在考虑创建一个新的列“line”,将源端口和目标端口连接起来,但不知道如何使交换的源端口和目标端口是同一行。

如果端口的ID不是按升序排列的,则可以使用
CASE
切换端口。然后按一对排序的帖子分组,按
count(*)
降序对结果排序,并使用
LIMIT
仅获取前3名

SELECT CASE
         WHEN s.source_port < s.destination_port
           s.source_port
         ELSE
           s.destination_port
       END a,
       CASE
         WHEN s.source_port < s.destination_port
           s.destination_port
         ELSE
           s.source_port
       END b
       FROM t_hr_ship s
       GROUP BY CASE
                  WHEN s.source_port < s.destination_port
                    s.source_port
                  ELSE
                    s.destination_port
                END,
                CASE
                  WHEN s.source_port < s.destination_port
                    s.destination_port
                  ELSE
                    s.source_port
                END
       ORDER BY count(*) DESC
       LIMIT 3;
选择案例
当s.source\u port
请参阅:另外,指定您的MySQL版本也会很有帮助,因为答案会因您是否拥有较新的版本(支持CTE等内容)而有所不同。