Поле переопределения в сложном соединенном MySQL Query

У меня есть запрос ниже, он сгенерирован функцией PHP, и он стал довольно сложным, но до сих пор работает нормально.

Что я хочу сделать, это переопределить один поле по второй поле, если в третьих поле равно 1.

Я хочу Таблица 2.cpda_meta_val фактически равен Таблица3.cpda_meta_val когда Таблица 4.cpda_meta_val равен 1, так что я могу затем использовать результирующее значение table2.cpda_meta_val в предложениях WHERE / ORDER BY.

Я надеюсь, что до сих пор имел смысл.

Вот оригинальный запрос:

SELECT
mainTable.cpda_id
FROM
cp_data AS mainTable
LEFT OUTER JOIN
cp_data AS table0
ON table0.cpda_meta_id = mainTable.cpda_id
AND table0.cpda_meta_key = '47248'
LEFT OUTER JOIN
cp_data AS table1
ON table1.cpda_meta_id = mainTable.cpda_id
AND table1.cpda_meta_key = '47241'
LEFT OUTER JOIN
cp_data AS table2
ON table2.cpda_meta_id = mainTable.cpda_id
AND table2.cpda_meta_key = '47242'
LEFT OUTER JOIN
cp_data AS table3
ON table3.cpda_meta_id = mainTable.cpda_id
AND table3.cpda_meta_key = '66838'
LEFT OUTER JOIN
cp_data AS table4
ON table4.cpda_meta_id = mainTable.cpda_id
AND table4.cpda_meta_key = '66843'
LEFT OUTER JOIN
cp_data AS table5
ON table5.cpda_meta_id = mainTable.cpda_id
AND table5.cpda_meta_key = '47252'
LEFT OUTER JOIN
cp_data AS table6
ON table6.cpda_meta_id = mainTable.cpda_id
AND table6.cpda_meta_key = '47255'
WHERE
mainTable.cpda_meta_id = 47236
AND mainTable.cpda_active = 1
AND mainTable.cpda_meta_key = 'set_element_stub'
AND table0.cpda_meta_val = 49297
AND table1.cpda_meta_val != 66116
AND (
table5.cpda_meta_val = 497
OR table6.cpda_meta_val = 497
)
ORDER BY
table2.cpda_meta_val,
mainTable.cpda_seq,
mainTable.cpda_id

Вот моя попытка достичь вышеупомянутого, которая не работает и не возвращает строки:

SELECT
mainTable.cpda_id
FROM
cp_data AS mainTable
LEFT OUTER JOIN
cp_data AS table0
ON table0.cpda_meta_id = mainTable.cpda_id
AND table0.cpda_meta_key = '47248'
LEFT OUTER JOIN
cp_data AS table1
ON table1.cpda_meta_id = mainTable.cpda_id
AND table1.cpda_meta_key = '47241'
LEFT OUTER JOIN
cp_data AS table2
ON table2.cpda_meta_id = mainTable.cpda_id
AND table2.cpda_meta_key = '47242'
LEFT OUTER JOIN
cp_data AS table3
ON table3.cpda_meta_id = mainTable.cpda_id
AND table3.cpda_meta_key = '66838'
LEFT OUTER JOIN
cp_data AS table4
ON table4.cpda_meta_id = mainTable.cpda_id
AND table4.cpda_meta_key = '66843'
LEFT OUTER JOIN
cp_data AS table5
ON table5.cpda_meta_id = mainTable.cpda_id
AND table5.cpda_meta_key = '47252'
LEFT OUTER JOIN
cp_data AS table6
ON table6.cpda_meta_id = mainTable.cpda_id
AND table6.cpda_meta_key = '47255'
CASE
WHEN table4.cpda_meta_val = 1 THEN table3.cpda_meta_val
ELSE table2.cpda_meta_val
END as table2.cpda_meta_val
WHERE
mainTable.cpda_meta_id = 47236
AND mainTable.cpda_active = 1
AND mainTable.cpda_meta_key = 'set_element_stub'
AND table0.cpda_meta_val = 49297
AND table1.cpda_meta_val != 66116
AND (
table5.cpda_meta_val = 497
OR table6.cpda_meta_val = 497
)
ORDER BY
table2.cpda_meta_val,
mainTable.cpda_seq,
mainTable.cpda_id

Если бы кто-то мог указать мне правильное направление, это было бы здорово! Спасибо!

РЕДАКТИРОВАТЬ — Для тех, кто ищет, я использовал ответ Гордона ниже, чтобы сделать следующий запрос, который теперь работает:

SELECT
mainTable.cpda_id,
(CASE
WHEN table4.cpda_meta_val = 1 THEN table3.cpda_meta_val
ELSE table2.cpda_meta_val
END) as override_val_0
FROM
cp_data AS mainTable
LEFT OUTER JOIN
cp_data AS table0
ON table0.cpda_meta_id = mainTable.cpda_id
AND table0.cpda_meta_key = '47248'
LEFT OUTER JOIN
cp_data AS table1
ON table1.cpda_meta_id = mainTable.cpda_id
AND table1.cpda_meta_key = '47241'
LEFT OUTER JOIN
cp_data AS table2
ON table2.cpda_meta_id = mainTable.cpda_id
AND table2.cpda_meta_key = '47242'
LEFT OUTER JOIN
cp_data AS table3
ON table3.cpda_meta_id = mainTable.cpda_id
AND table3.cpda_meta_key = '66838'
LEFT OUTER JOIN
cp_data AS table4
ON table4.cpda_meta_id = mainTable.cpda_id
AND table4.cpda_meta_key = '66843'
LEFT OUTER JOIN
cp_data AS table5
ON table5.cpda_meta_id = mainTable.cpda_id
AND table5.cpda_meta_key = '47252'
LEFT OUTER JOIN
cp_data AS table6
ON table6.cpda_meta_id = mainTable.cpda_id
AND table6.cpda_meta_key = '47255'
WHERE
mainTable.cpda_meta_id = 47236
AND mainTable.cpda_active = 1
AND mainTable.cpda_meta_key = 'set_element_stub'
AND table0.cpda_meta_val = 49297
AND table1.cpda_meta_val != 66116
AND (
table5.cpda_meta_val = 497
OR table6.cpda_meta_val = 497
)
ORDER BY
override_val_0,
mainTable.cpda_seq,
mainTable.cpda_id

0

Решение

case Заявление относится к select пункт:

SELECT mainTable.cpda_id,
(CASE WHEN table4.cpda_meta_val = 1 THEN table3.cpda_meta_val
ELSE table2.cpda_meta_val
END) as cpda_meta_val

Вы можете поместить это выражение непосредственно в order by а также (который, кажется, единственное место, которое вы используете table2_cpda_meta_val:

ORDER BY (CASE WHEN table4.cpda_meta_val = 1 THEN table3.cpda_meta_val
ELSE table2.cpda_meta_val
END),
mainTable.cpda_seq,
mainTable.cpda_id
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]