mysql - SQL:确定一个 1:many 是否在另一个 1:many 中

标签 mysql sql

考虑一下航运业,其中有运输 cargo 的公司(承运人)和运输 cargo 的公司(托运人)。每个人都有根据州采取的路线。例如,托运人将 cargo 从缅因州发送到加利福尼亚州,从缅因州发送到堪萨斯州,从新罕布什尔州发送到阿拉巴马州等。承运人也同样具有由州到州定义的“路线”。我想使用一个 SQL 查询来快速为托运人选择承运人,该托运人在任何运输起点/目的地和任何承运人路线之间至少有一个匹配。

数据库布局如下:

发货人与契约(Contract)是一对一的关系。契约(Contract)与车道有 1:m 的关系。车道用最简单的术语“originState”和“destinationState”来定义。

从这里我需要查询所有可能的承运商,看看哪些承运商可能对该契约(Contract)进行投标,这相当于该承运商至少有一条支持的路线与任何一条契约(Contract)航线相匹配。绘制与所有“路线”具有 1:m 关系的承运商表,再次定义为 originState 和 destinationState。

此时,我只需要匹配的运营商列表。我什至不关心哪条路线匹配,只关心他们有资格竞标契约(Contract)。

谢谢!

根据要求,以下是当前查询:

SELECT DISTINCT
    r.id as contractId, c.id as carrierId
FROM
    contract r
        JOIN
    contractLane rl ON rl.contractId = r.id
        JOIN
    lane l on l.origState = rl.originState and l.destState = rl.destState /*carrier lane matches any contract lane*/
        JOIN 
    carrier c on c.id = l.companyId
        JOIN 
    user u ON u.id = l.masterId and u.type = 4 /* lane owner is a carrier */
WHERE
    r.expireDate >= NOW()
        AND r.open = '1'
        AND r.active = '1'

最佳答案

根据您的描述,这非常简单。假设每个表 id 的主键 id id 和外键列的格式为 table_id

这是获得结果的一种方法:

 SELECT c.*
   FROM carrier c
   JOIN route r
     ON r.carrier_id = c.id
   JOIN lane l
     ON l.originState = r.originState
    AND l.destinationState = r.destinationState
   JOIN contract o
     ON o.id = l.contract_id
   JOIN shipper s
     ON s.id = o.shipper_id
  GROUP BY c.id
  • 每个承运商都有零条、一条或多条航线。
  • 每条路线都有出发地和目的地州。
  • 每个托运人契约(Contract)“ channel ”都有一个出发地和目的地州。
  • 如果出发地和目的地州匹配,则路线将匹配“车道”。
  • “ channel ”引用单个合约。
  • 契约(Contract)引用单一托运人。

可能存在多个匹配项,因此我们使用运营商表的 GROUP BY pk 来返回唯一的运营商列表。

关于mysql - SQL:确定一个 1:many 是否在另一个 1:many 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21151857/

相关文章:

mysql - SQL - 条件连接

java - 在子实体中更新或插入新行

c# - 如何制作表格以获取编辑其他表格中的值时的日期/时间?天猫

mysql - 语法 WHERE 子句

python - 程序退出时MySQL行被删除

mysql - 在 MySQL 中连接表 A 的行和表 B 的列

sql - Teradata - 调用名称中包含空格的表

java - 带 sql 数据库的 Selenium Webdriver

PHP mysql : registration returning false

MySql 如何在 1 个命令中计算行数