2012-06-27 48 views
2

在我們開始之前,不要責怪我,我沒有設計數據庫。我很清楚,有必要時可以列。MySQL加入基於類似領域的自我

考慮這個片段的MySQL:

SELECT r.id, 
    crf.field_name, 
    crf.field_value 
FROM reports r 
    JOIN custom_report_fields crf 
    ON crf.report_id = r.id 
WHERE r.id IN (100, 101) 
    AND field_name LIKE "service_%" 

其中產量這些無用的結果:

ID | field_name  | field_value 
------------------------------------------------ 
100 | service_id_1 | 20 
100 | service_name_1 | "Shipping" 
100 | service_cost_1 | 5.25 
101 | service_id_1 | 21 
101 | service_name_1 | "Handling" 
101 | service_cost_1 | 7.50 
101 | service_id_2 | 20 
101 | service_name_2 | "Shipping" 
101 | service_cost_2 | 7.75 

我需要查詢的,將產生像這樣的結果:

Report ID | Field ID | Name  | Cost 
------------------------------------------------ 
100  | 20  | "Shipping" | 5.25 
101  | 21  | "Handling" | 7.50 
101  | 20  | "Shipping" | 7.75 

請注意,與報告相關的任何成本都可能與相關成本開始相關g另外三個條目和增加的後綴('service_id_x','service_name_x','service_cost_x')。

這個問題的回答者會比你選擇的宗教的其他追隨者得到一個遠遠優越的來世。

+0

爲什麼會出現'service_id_1','service_name_1','在service_cost_1'不止一次表?你說的'1'不應該隨着每一個代價而增加嗎?所有三個字段的行都是唯一的嗎? –

回答

2

試試這個解決方案。這是相當笨重(它只能是如此的優雅賦予設計本身的笨重性質!),但它的工作原理:

SELECT 
    a.id AS Report_ID, 
    MAX(CASE WHEN b.field_name LIKE 'service_id_%' THEN b.field_value END) AS Field_ID, 
    MAX(CASE WHEN b.field_name LIKE 'service_name_%' THEN b.field_value END) AS Name, 
    MAX(CASE WHEN b.field_name LIKE 'service_cost_%' THEN b.field_value END) AS Cost 
FROM 
    reports a 
INNER JOIN 
    custom_report_fields b ON a.id = b.report_id 
WHERE 
    a.id IN (100, 101) AND 
    b.field_name LIKE 'service_%' 
GROUP BY 
    a.id, 
    SUBSTRING_INDEX(b.field_name, '_', -1) 
+0

如果條目無法正常工作,這不會造成問題嗎? –

+0

@LukeTheObscure,我剛剛編輯了我的解決方案。只要你沒有重複的'report_id - > field_name'的組合,它就會很好用。在您的示例數據中,對於相同的'report_id'(名稱和成本相同),您會有'service_id_1'多次,這會導致此解決方案中斷。我在想,你可能錯誤輸入了,因爲你說每個字段的數字都會增加。如果*不是*錯誤類型,那麼我不能給你一個工作解決方案,因爲據我所知,沒有辦法正確地將'field_value'與'field_name'對齊。 –

+0

好的!這確實是一個錯字。我會今天嘗試你的解決方案,並讓你知道它是如何發展的。 –