在表格中找到不同的电台组合

时间:2015-08-24 20:30:14

标签: mysql sql

下面有一个包含示例数据的表格。想知道表格中不同的电台组合。

Table Name: train_route

FROM_STN    TO_STN   DISTANCE 
BLR         CHENNAI  800
DEL         MUMBAI   1500
VNS         DEL      1000
MUMBAI      DEL      1497
CHENNAI     BLR      798

相同电台的不同记录的距离可能不同。我想知道表格中所有不同的电台组合。

例如:对于上面的样本,所需的输出将是

FROM_STN    TO_STN
BLR         CHENNAI
DEL         MUMBAI
VNS         DEL

实际的表格有数十亿条记录。任何可以使用自联接完成的事情?

2 个答案:

答案 0 :(得分:0)

select tr.* from
(
select from_stn as frs, to_stn as tos
from train_route
union
select to_stn, from_stn
from train_route) t
join train_route tr on t.frs = tr.from_stn and t.tos = tr.to_stn

您可以使用union删除重复项。

答案 1 :(得分:0)

如果只有不同的组合而不是哪个站是重要的,你可以只进行词法比较和交换位置,以便较低的站始终显示在第一列中,然后通过以下方式进行分组:

select 
    if(FROM_STN < TO_STN, FROM_STN, TO_STN) station1,
    if(FROM_STN > TO_STN, FROM_STN, TO_STN) station2
from 
    train_route
group by 
    if(FROM_STN < TO_STN, FROM_STN, TO_STN),
    if(FROM_STN > TO_STN, FROM_STN, TO_STN);

这会给你一个结果:

| station1 | station2 |
|----------|----------|
|      BLR |  CHENNAI |
|      DEL |   MUMBAI |
|      DEL |      VNS |

Sample SQL Fiddle

另一种可能表现更好的解决方案(取决于键和索引):

select distinct from_stn, to_stn
from
(
    select from_stn, to_stn from train_route
    union all
    select to_stn, from_stn from train_route
) all_pairs
where from_stn < to_stn;

最后,我不认为有必要进行词汇比较。