我試圖找到一個查詢,該查詢可以使用多個共享列來加入兩個表,並加上兩個增量列,它們不共享相同的值但按照某種順序排列。我奮力用簡單的英語來解釋這個問題,所以這裏有一個例子:根據具有不同值的順序加入兩列
第一個表項,看起來像:
|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列以對模式進行收費,那麼我期待推遲,這似乎是理想的解決方案。
有沒有人想過解決這個問題的最佳方法?
不幸的是,ITEM_ID和charge_id由系統的兩個不同的部件分配,而不是相同的值。唯一的保證是,通過charge_id進行排序並按item_id排序會加入正確的記錄,但是我無法在charge_id = item_id上進行簡單的加入 –