2012-06-27 4 views
2

시작하기 전에 나를 비난하지 말고 데이터베이스를 디자인하지 않았습니다. 필요한 경우 열을 추가 할 수 있음을 잘 알고 있습니다.비슷한 필드를 기반으로 MySQL에 자체 가입 MySQL

MySQL의이 조각 고려 :

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

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 

내가 지금과 같은 결과를 얻을 것입니다 쿼리의 필요이다 :이 도움이되지 않는 결과를 얻을 수

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_%" 

보고서와 관련하여 비용이 많이 들지만 각각의 비용은 연속적으로 증가 할 수 있습니다. 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's를'field_name's에 정확하게 정렬 할 수있는 방법이 없기 때문에 당신에게 해결책을 줄 수는 없습니다. –

+0

좋은 캐치! 참으로 오타였습니다. 오늘 해결책을 시험해보고 어떻게 진행되는지 알려 드리겠습니다. –