2012-06-27 3 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 

Помните, что может быть любое количество расходов, связанных с отчетом, с каждой последующей стоимостью gettin 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'. В ваших образцовых данных у вас есть 'service_id_1' более одного раза для того же самого' report_id' (то же самое для имени и стоимости), что вызовет разрыв этого решения. Я думал, что вы можете ошибаться, потому что вы сказали, что цифры будут увеличиваться для каждого трио полей. Если это * не было * ошибочным, то я не могу дать вам рабочее решение, так как не было бы возможности правильно выровнять 'field_value' с именем 'field_name', насколько я знаю. –

+0

Хороший улов! Это была опечатка. Я попробую ваше решение сегодня и дам вам знать, как это происходит. –

Смежные вопросы