2

始める前に、私を責めないでください。データベースを設計したのは私ではありません。必要に応じて列を追加できることは十分承知しています。

次の 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

レポートには任意の数のコストが関連付けられる可能性があり、連続するコストごとに別の 3 つのエントリと増加したサフィックス ('service_id_x'、'service_name_x'、'service_cost_x') が取得されます。

この質問に答えた人は、あなたが選んだ宗教の他の信者よりもはるかに優れた死後の世界を手に入れるでしょう。

4

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)
于 2012-06-27T00:16:22.960 に答える