【问题标题】:Find distinct combination of stations in table在表中查找不同的站点组合
【发布时间】:2015-08-24 20:30:14
【问题描述】:

我有一个表格,下面有示例数据。想知道表中存在的电台的不同组合。

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

实际的表有数十亿条记录。使用 self join 可以做什么?

【问题讨论】:

  • 根据您发布的数据,不存在重复数据。
  • 从 train_route 中选择不同的 from_stn,to_stn ...哦,等等,我是瞎子。火车来回使用相同的轨道吗?
  • 在编辑之前更清晰了一点!
  • 为什么不钦奈 -> Blr
  • 您的问题不清楚。下次尝试提供SqlFiddle,以便我们可以更快更好地为您提供帮助——也请阅读How to ask

标签: mysql sql


【解决方案1】:
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 删除重复项。

【讨论】:

  • op 正在寻找的是fromto 的组合。请再次阅读问题。至少我能理解。
  • @vkp 此查询未提供所需的输出。
【解决方案2】:

如果只有不同的组合而不是去往或来自哪个站很重要,您可以进行词汇比较并交换位置,以便较低的站始终显示在第一列中,然后按以下方式进行分组:

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;

最后,我认为不必进行词法比较。

【讨论】:

  • 这个查询会给我正确的答案。但实际的表有数十亿条记录。所以这个查询在那种情况下会很慢。使用自联接可以做什么?
  • @shruti 应该可以使用连接,但我现在似乎无法弄清楚查询。
  • @shruti 我添加了第二个可能表现更好的解决方案。
  • 感谢您的回答。我已经使用您的逻辑添加了我的解决方案。请也检查一下。
【解决方案3】:

感谢您的所有回答。 我的问题得到了解决方案。只是想和大家分享一下。

    select a.from_stn,a.to_stn
    from train_route a 
    left join train_route b
    on a.from_stn=b.to_stn and a.to_stn=b.from_stn
    where a.from_stn<=coalesce(b.from_stn,a.from_stn);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2018-02-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多