2017-08-03 65 views
0

我試圖找到一個查詢,該查詢可以使用多個共享列來加入兩個表,並加上兩個增量列,它們不共享相同的值但按照某種順序排列。我奮力用簡單的英語來解釋這個問題,所以這裏有一個例子:根據具有不同值的順序加入兩列

第一個表項,看起來像:

|id|user |period |item_id| 
|--|-----|---------|-------| 
|01|1234 |January |1  | 
|02|1234 |January |2  | 
|03|1234 |January |3  | 
|04|1234 |February |1  | 
|05|1234 |February |2  | 
|--|-----|---------|-------| 

我想它加入到一個表,收費,像:

|id|user |period |charge_id| 
|--|-----|---------|---------| 
|01|1234 |January |1072  | 
|02|1234 |January |1073  | 
|03|1234 |January |1074  | 
|04|1234 |February |567  | 
|05|1234 |February |570  | 
|--|-----|---------|---------| 

我的目標是要找到一個查詢,其結果是:

|id|user |period |charge_id|item_id| 
|--|-----|---------|---------|-------| 
|01|1234 |January |1072  |1  | 
|02|1234 |January |1073  |2  | 
|03|1234 |January |1074  |3  | 
|04|1234 |February |567  |1  | 
|05|1234 |February |570  |2  | 
|--|-----|---------|---------|-------| 

一個解決方案,我認爲ed是使用臨時表或子查詢來訂購費用並以我可以直接加入item_id的方式編號。

CREATE TEMPORARY TABLE numbered_charges AS 
    SELECT @row_num:=IF(@last_user=user AND 
         @last_period=period, 
         @row_num+1, 1) AS charge_number, 
     @last_user:=user as user, 
     @last_period:=period as period, 
     charge_id 
    FROM charges 
; 

SELECT charges.*, items.item_id FROM numbered_charges AS charges 
JOIN items ON (charges.charge_number = items.item_id) 

但是,我擔心這不是一個有效的解決方案。這是一個將作爲數據完整性測試的一部分定期運行的查詢,因此避免不必要的預處理非常重要。如果我建議添加charge_number列以對模式進行收費,那麼我期待推遲,這似乎是理想的解決方案。

有沒有人想過解決這個問題的最佳方法?

回答

0

使用AND操作員幫助會加入多個列嗎?

SELECT 
T1.id, 
T1.user, 
T1.period, 
T2.charge_id, 
T1.item_id 
FROM Table1 AS T1 
LEFT JOIN Table2 AS T2 ON T1.id=T2.id 
AND T1.user=T2.user 
AND T1.period=T2.period 
+0

不幸的是,ITEM_ID和charge_id由系統的兩個不同的部件分配,而不是相同的值。唯一的保證是,通過charge_id進行排序並按item_id排序會加入正確的記錄,但是我無法在charge_id = item_id上進行簡單的加入 –

0
Select id, 
user, 
period, 
charge_id, 
item_id 
From items 
Left join charges on(items.id = charges.id) 
相關問題