2015-08-27 64 views
0

我想請求幫助提供兩個表中的值的SQL請求。根據連接表內的其他值選擇值SQL

作爲一個例子,我有一個Table orders和一個表格處理。

我想報告訂單和處理狀態。

table orders 

id | status | div 
------------------- 
1 | wating_r | div1 
2 | closed | div2 
3 | closed | div3 

-

table processing: 

id | order_id | type   | date 
---------------------------------------- 
1 | 2  | send_request | 15.01.15 
2 | 2  | send_invoice | 30.01.15 
3 | 1  | send_request | 01.02.15 
4 | 3  | send_request2 | 10.02.15 
5 | 3  | send_invoice | 15.02.15 

我想得到什麼:

order_id | status | date_request | date_request2 | date_invoice 
-------------------------------------------------------------------------------- 
1  | waiting_r | 01.02.15  | NULL   | NULL 
2  | closed | 15.01.15  | NULL   | 30.01.15 
3  | closed | NULL   | 10.02.15  | 15.02.15 

我的解決方案:

select orders.id as order_id, orders.status, IF(processing.type='send_invoice',date_format(processing.date, '%Y-%m-%d'), NULL) as date_invoice, IF(processing.type='send_request',date_format(processing.date, '%Y-%m-%d'), NULL) as date_request, IF(processing.type='send_request2',date_format(processing.date, '%Y-%m-%d'), NULL) as date_request2

from orders inner join processing on orders.id = processing.order_id

where case when orders.status='closed' then processing.type='send_invoice' when orders.status='waiting_r' then processing.type='send_request' when orders.status='waiting_2'then processing.type='send_request2' end

這工作得很好,但這個IF語句我不會成爲從請求日期時,發票被送往 - 我只得到發票的日期。

而不是案件請求,我嘗試了以下,但在這種情況下,我爲每個訂單有多個行。當我嘗試「分組」時,我混合了數據。

where processing.type in ('send_invoice', 'send_request', 'completion_request_send')

+0

你試過嵌套嗎? (即。** SELECT div div FROM orders WHERE id IN(SELECT order_id FROM processing WHERE type ='send_request')**)然後加入結果? – NemanjaT

+0

還沒有testet,謝謝你 – KillVirus

回答

0

你需要第二臺左加入到第一三倍,像這樣。與ID匹配標準與特定類型的選擇翻出你需要爲每列行

SELECT o.id AS order_id, o.status, 
     p1.date AS date_request, 
     p2.date AS date_request2, 
     p3.date AS date_invoice 
    FROM orders o 
    LEFT JOIN processing p1 ON o.id = p1.order_id AND p1.type='send_request'   
    LEFT JOIN processing p2 ON o.id = p2.order_id AND p2.type='send_request2' 
    LEFT JOIN processing p3 ON o.id = p3.order_id AND p3.type='send_invoice' 
ORDER BY 1,2 

該左聯接。與inner相反,left與join相連,允許缺少的值顯示爲null。

這是工作。 http://sqlfiddle.com/#!9/b8c74/5/0

這是加入密鑰/值表(ID /密鑰)對唯一的典型模式。

編輯不幸的是,在特定值存在重複鍵的情況下,它會生成重複的結果集行。爲了解決這個問題,在這種情況下,有必要對鍵/值表(processing)進行重複數據刪除。

此子查詢將採用最新的日期值。

   SELECT type, order_id, MAX(date) AS date 
       FROM processing 
       GROUP BY type, order_id 

然後,您必須在主查詢中使用該子查詢。如果MySQL具有公共表表達式,這將是一個好的選擇。但事實並非如此。

SELECT o.id AS order_id, o.status, 
     p1.date AS date_request, 
     p2.date AS date_request2, 
     p3.date AS date_invoice 
    FROM orders o 
    LEFT JOIN (
       SELECT type, order_id, MAX(date) AS date 
       FROM processing 
       GROUP BY type, order_id 
      ) p1 ON o.id = p1.order_id AND p1.type='send_request'   
    LEFT JOIN (
       SELECT type, order_id, MAX(date) AS date 
       FROM processing 
       GROUP BY type, order_id 
      ) p2 ON o.id = p2.order_id AND p2.type='send_request2' 
    LEFT JOIN (
       SELECT type, order_id, MAX(date) AS date 
       FROM processing 
       GROUP BY type, order_id 
      ) p3 ON o.id = p3.order_id AND p3.type='send_invoice' 
ORDER BY 1,2 
+0

工作得很好,非常感謝你! – KillVirus

+0

當我對同一個'order_id'有多個'send_request'時,我該如何避免獲得多行?那麼我怎樣才能選擇爲'date_request'設置哪個日期值呢?非常感謝! – KillVirus

+0

請參閱我的編輯。 –