gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:48:47 26 4
gpt4 key购买 nike

考虑一下航运业,其中有运输 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com