2014-01-16 31 views
0

考慮運輸行業,哪裏有搬運物料的公司(運輸公司)和運送物料的公司(託運人)。每個人都有基於國家的路線。例如,託運人從緬因州到加利福尼亞州,從緬因州到堪薩斯州,從新罕布什爾州到阿拉巴馬州等發送東西。承運人同樣具有由州到州定義的「路線」。我想使用一個SQL查詢,它可以爲任何發貨起運地/目的地與任何運輸公司之間至少有一個匹配的託運人快速選擇運輸公司。SQL:確定是否一個1:很多在另一個1:很多

數據庫佈局如下:

託運人是一個1:合同米關係。合同與車道的關係爲1:m。通道的最簡單的術語是originState和destinationState。

從這裏我需要查詢所有可能的承運人,看看哪些承運人可能在該合同上出價,這相當於承運人至少有一條支持它的路線與任何一條合同車道相匹配。將載體表與1:m的關係映射到它的所有「路由」,再次定義爲originState和destinationState。

在這一點上,我只需要匹配的運營商列表。我甚至不關心哪條路線匹配,只是他們有資格競標合同。

謝謝!

按照要求,下面是當前查詢:

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' 
+0

有一點需要注意的是,託運人可以擁有多個通道,因爲託運人可以使得簡單的JOIN非常密集;以至於查詢在30秒後實際超時。 –

+0

如果您要顯示試圖解決該問題的SQL語句,那將非常有幫助。 –

+0

完成;看到編輯的問題。 –

回答

0
SELECT S.id, S.originState, S.destinationState 
FROM carrier AS C, shipper AS S 
WHERE (C.originState = S.originState 
    OR C.originState = S.destinationState 
    OR C.destinationState = S.originState 
    OR C.destinationState = S.destinationState) 
    AND C.id = 34 

34是你正在篩選在載體的id。

你也可以用JOIN做同樣的事情。

+0

除非我們正在處理2個不同的表格,否則這將工作得很好。有一個路由表(對於運營商)和一個通道表(對於託運人) –

+0

所以R1.id!= R2.id將不起作用... –

+0

這兩個表都有兩個列originState和destinationState? –

0

從你所描述的情況來看,這很簡單。這假定每個表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 
  • 每個載波具有零,一個或多個路由。
  • 每條路線都有起點和目的地狀態。
  • 每個託運人合同「車道」具有起運和目的地國家。
  • 如果起點和目的地州匹配,路線將匹配「車道」。
  • 「通道」引用單個合同。
  • 合同引用單個託運人。

有可能發生多個匹配,因此我們使用載體表的GROUP BY pk返回載體的唯一列表。

+0

謝謝。這或多或少是我所擁有的多連接查詢。儘管如此,c.id的小組確實減少了查詢時間。儘管如此,我們仍處於20秒,這是多次查詢(每個合同一次)的時間。是否希望有一種優雅的方式可以說明這種運輸商路線中是否存在其中一條運輸路線? –