Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Mysql如何连接这些表

Mysql如何连接这些表
EN

Stack Overflow用户
提问于 2014-04-06 05:58:18
回答 2查看 81关注 0票数 0

我有以下表格和样本数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SCHEDULE TABLE
fightno   day_of_week  orgin    dest  depart_time   arrive_time     totalfare
AQ2131    WED          BLR      KTA   04:30         11:00           6000

FLIGHT_STOPS (if it have stops)
flightno  day_of_week  airport_code   arrival_time  departure_time  stopmilesfare
AQ2131    WED          BOM            02:17         05:40           3000 
AQ2131    WED          COH            03:17         06:40           3000 
AQ2131    WED          GOY            04:17         08:40           3000

航线为BLR -> BOM -> COH -> GOY -> KTA

我如何加入这些表,以便如果用户输入其中任何一个作为源和目标,则检索flightno。例如,如果用户输入BLR作为源,COH作为目的地,COH作为源,GOY作为目的地,我们可以找到航班号。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-07 04:13:31

首先,让我们退一步。航班只是从A到D的一个方向,或D到A的方向,这两个不同的航班号。你必须有正确的方向相关性才能得到正确的飞行。笑一笑,想象中的国脚

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Flight #123 From Country A -> B -> C -> D.
Flight #987 From Country D -> C -> B -> A.

两次旅行都有“C”和“B”..。但是如果我们的旅程是从'C‘开始,以'B’结束的话,你需要987次航班,因为你需要在'C‘的飞机上,然后在'B’停--在那个方向。123号航班会失败,因为你会在'A‘下在'B’和到达'C‘站被接上。我将使用'CCC‘和'BBB’只是为了遵守3字符机场代码与查询。

第一个查询(它将是UNION的一部分)获取从给定位置开始的所有航班.无论是目的地还是行程的其中一条腿,目的地都是所需的'BBB‘位置。通过在相同的航班和目的地机场代码上使用左/连接,如果它不是空的,那么就有一条腿到那个目的地。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT 
      s1.flightNo
   from 
      schedule s1
         LEFT JOIN flight_stops fs1
            ON s1.flightNo = fs1.flightNo
            AND fs1.airport_code = 'BBB'
   where 
          s1.origin = 'CCC'
      AND (    s1.dest = 'BBB'
           OR fs1.flightNo IS NOT NULL )

下一个查询( UNION ALL one)将得到从其他地方开始的任何航班,该航班有一条腿作为旅程的开始飞行(CCC)。然后,它将加入进度表,看看航班的目的地是否是“BBB”。如果不是那样的话,那么也可以再看一次航班停止表,但特别是对于“BBB”来说,“BBB”的到达时间在“CCC”开始飞行时间之后。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT 
      fs1.flightNo
   from 
      flight_stops fs1
         LEFT JOIN schedule s2
             ON fs1.flightNo = s2.flightNo
            AND s2.dest = 'BBB'

         LEFT JOIN flight_stops fs2
             ON fs1.flightNo = fs2.flightNo
            AND fs1.arrival_time < fs2.arrival_time
            AND fs2.airport_code = 'BBB'
   where 
      fs1.airport_code = 'CCC'

既然我们得到的只是航班号,那就把这两个航班联合起来。既然一架飞机不能同时起飞,又不能同时成为一条腿,他们就永远不会拉同一架飞机。如果你想要实际的其余的航班信息,你也可以结束。

因此,对航班的最后查询将是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(first select above)
UNION ALL
(second select above)

有航标信息..。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT
      s.*
   from
      ( (first select above)
         UNION ALL
         (second select above) ) QualFlights
      JOIN Schedule s
         ON QualFlights.flightNo = s.flightNo

现在,所有这一切,如果您的flight_stops表包含了原产地和目的地位置,就会容易得多。然后,整个查询可以简化为并在flight_stops上有一个索引.(airport_code、flightNo、arrival_time )

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  SELECT 
          fs1.flightNo
       from 
          flight_stops fs1
             LEFT JOIN flight_stops fs2
                 ON fs1.flightNo = fs2.flightNo
                AND fs1.arrival_time < fs2.arrival_time
                AND fs2.airport_code = 'BBB'
       where 
          fs1.airport_code = 'CCC'

是的..。这是一个查询,您基本上需要的是在table表的“腿”中同时包含起始点和目的地。

票数 1
EN

Stack Overflow用户

发布于 2014-04-06 08:25:07

这是使用CTE和ROW_NUMBER来代表缺少的LegNo的TSQL。我现在没有时间把它翻译成MySQL,但是在LegNo已经存在的情况下,这是非常容易的。

另外,ISNULL(x,y)不是MySQL,但是当x为NULL时,则应该转换为y。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE Schedule (FlightNo CHAR(6), Week_Day CHAR(3), Origin CHAR(3), Dest CHAR(3), Time_Depart Time, Time_Arrive Time)
CREATE TABLE Flight_Stop (FlightNo CHAR(6), Week_Day CHAR(3), Airport CHAR(3), Time_Arrive Time, Time_Depart Time)

INSERT INTO Schedule VALUES 
 ('AQ2131','WED','BLR','KTA','01:30','11:00')
,('AB1234','TUE','AAA','BBB','01:00','02:00')
INSERT INTO Flight_Stop VALUES 
 ('AQ2131','WED','BOM','02:17','05:40')
,('AQ2131','WED','COH','03:17','06:40')
,('AQ2131','WED','GOY','04:17','08:40')

WITH cte AS (
  SELECT *
        ,ROW_NUMBER() OVER (PARTITION BY FlightNo, Week_Day ORDER BY Time_Arrive) LegNo 
    FROM Flight_Stop
)
SELECT s.FlightNo
      ,s.Week_Day
      ,s.Origin
      ,ISNULL(f.Airport,s.Dest) Dest
      ,0 LegNo
  FROM Schedule s
       LEFT JOIN
       cte f ON s.FlightNo = f.FlightNo
            AND s.Week_Day = f.Week_Day
 WHERE ISNULL(f.LegNo,1) = 1
UNION 
SELECT s.FlightNo
      ,s.Week_Day
      ,s.Origin
      ,ISNULL(f.Airport,s.Dest) Dest
      ,f.LegNo
  FROM Schedule s
       LEFT JOIN
       cte f ON s.FlightNo = f.FlightNo
            AND s.Week_Day = f.Week_Day
 WHERE f.LegNo = (SELECT MAX(LegNo)
                    FROM cte a 
                   WHERE a.FlightNo = f.FlightNo
                     AND a.Week_Day = f.Week_Day)
UNION
SELECT a.FlightNo
      ,a.Week_Day
      ,a.Airport
      ,b.Airport
      ,a.LegNo
  FROM cte a
       INNER JOIN
       cte b ON a.FlightNo = b.FlightNo
            AND a.Week_Day = b.Week_Day
            AND a.LegNo + 1 = b.LegNo
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22895022

复制
相关文章
十三、表连接
表连接(JOIN)是在多个表中间通过一定的连接条件,使表之间发生关联进而能从多个表之间获取数据。简单的表连接语法如下:
喵叔
2021/06/25
8570
十三、表连接
Oracle表连接
  内连接:查询满足条件的结果集,是相对于外连接来说的(条件的话由很多种可以等于、不等于、大于、小于等等)。
翎野君
2023/05/12
7310
如何使用python连接MySQL表的列值?
MySQL 是一个开源关系数据库管理系统,广泛用于存储、管理和组织数据。使用 MySQL 表时,通常需要将多个列值组合成一个字符串以进行报告和分析。Python是一种高级编程语言,提供了多个库,可以连接到MySQL数据库和执行SQL查询。
很酷的站长
2023/08/11
3080
如何使用python连接MySQL表的列值?
面试之前,MySQL表连接必须过关!——表连接的原理
我们知道,所谓表连接就是把各个表中的记录都取出来进行依次匹配,最后把匹配组合的记录一起发送给客户端。比如下面把t1表和t2表连接起来的过程如下图
砖业洋__
2023/05/06
2K0
面试之前,MySQL表连接必须过关!——表连接的原理
连表查询的介绍_连接表
大家好,又见面了,我是你们的朋友全栈君。 1、连表查询的原因 (1)如果查询结果不在一个表中,在多个表中,那就需要将表关联,进行连表查询。 (2)连表查询大多数都作用在外键得基础上。—表与表之间有关
全栈程序员站长
2022/10/05
3.1K0
连表查询的介绍_连接表
MySQL之表连接
当需要同时显示多个表的字段时,就可以用表连接来实现这样的功能。从大类上分,表连接可分为内连接和外连接,它们之间的最主要区别是,内连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录。
秋白
2019/02/21
2K0
MySQL之表连接
【MySql】表的内连接和外连接
内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。
平凡的人1
2023/10/15
2960
【MySql】表的内连接和外连接
简单备份wordpress连接表
用过 wordpress 的朋友都知道,WordPress 可以导出 WordPress eXtended RSS 或 WXR 文件,它包含了您的全部文章、页面、评论、自定义域、分类目录和标签。我们可以在再次安装 WordPress 时导入它。那么WordPress 的链接表怎么备份呢?
空空裤兜
2023/03/03
6870
MySQL表的内外连接
内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。而使用where进行笛卡尔积筛选的时候,后面必须跟着一个过滤条件,将不合理的数据筛选掉,并且这时候再跟着其他条件就需要and其他条件,所以这种方式的内连接虽然可以,但是容易将内连接的条件与其他约束条件混淆,不容易区分。
每天都要进步呀
2023/10/16
2160
MySQL表的内外连接
SQL三表连接查询
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/135565.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/18
2.1K0
MySQL | 表的内连接
数据操作语言:表连接查询(一) 从多张表中提取数据 从多张表提取数据,必须指定关联的条件。如果不定义关联条件就会出现无条件连接,两张表的数据会交叉连接,产生 笛卡尔积。 规定了连接条件的表连接语句,就不会出现笛卡尔积。 # 查询每名员工的部门信息 SELECT e.empno,e.ename,d.dname FROM t_emp e JOIN t_dept d ON e.deptno=d.deptno; 表连接的分类 表连接分为两种:内连接 和 外连接 内连接是结果集中只保留符合连接条件的记录 外
Zkeq
2022/05/18
3.4K0
MySQL | 表的内连接
关于哈希表,你该了解这些!
首先什么是 哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道都是指hash table就可以了)。
代码随想录
2020/07/13
5830
学习日志——SQL几种表连接和连接效率
最近在进行一个数据展示的项目,问题是公司目前的情况是采集到了数据,将数据存入到了一个数据中心,然后就没有任何操作了。也就是说要从原始数据当中查询数据进行数据展示,这是一个很难受的过程,但是又是一个要必然经历的过程,因为原始数据来了之后,必然要通过实际的业务来检验数据的正确性,有效性和质量,然后就对应的业务数据进行清洗,提取存入业务库,方便以后的操作。然后后端代码基本上没怎么写,全部都思考查询sql应该怎么写了。
海加尔金鹰
2020/06/09
2.2K0
Oracle数据库 表连接与表设计
select deptno,e.ename,d.dname from emp e natural join dept d;
wolf
2020/09/21
2.2K0
Oracle表连接学习笔记
内连接:指表连接的结果只包含那些完全满足连接条件的记录。下面学习一下内连接的,给个例子,这里创建两张表,然后用内连接方式查询,看看例子:
SmileNicky
2019/06/25
9200
如何制作bom表_如何制作bom表
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/175678.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
3K0
树状数据库表查询2次以上(自连接、内连接、别名、邻接表)方法
https://www.cnblogs.com/kissdodog/p/3297894.html——这个讲清楚了。
hotqin888
2022/05/07
4530
执行计划之表连接1:连接树(Join Trees)
阅读官方在线文档无疑是学习Oracle最好的方法,本文参考在线文档介绍表连接以及连接树(Join Trees)。
SQLplusDB
2022/08/19
6550
执行计划之表连接1:连接树(Join Trees)
SAS中哈希表的连接问题
哈希表即散列表(Hash table),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。在SAS中使用哈希表十分简单,你并不需要知道SAS内部是怎么实现的,只需要知道哈希表是存储在内存中的,查找是根据key值直接获得存储的地址的精确匹配。加上使用哈希表合并数据集时不用排序的优点,在实际应用中可以极大的提高程序运行效率,尤其是数据集较大的时候。但是由于哈希表是放到内存中的,因此对内存有一定要求!
专业余码农
2020/07/15
2.4K0
点击加载更多

相似问题

当键是数字时,python字典

10

混合字典排序和数字排序

11

当数字的数字分开时对它们进行排序

10

当数字被重复时,数据读取

21

仅当没有重复的数字时才打印数字

60
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文