我有下面的查询,它是由 PHP 函数生成的,它变得相当复杂,但到目前为止运行良好。
如果第三字段等于1,我想要做的是用第二字段覆盖一个字段。
所以当table4.cpda_meta_val等于1时,我希望table2.cpda_meta_val实际上等于table3.cpda_meta_val,这样我就可以在 WHERE/ORDER BY 子句中使用结果值 table2.cpda_meta_val。
我希望到目前为止我已经明白了。
这是原始查询:
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
最佳答案
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
关于php - 覆盖复杂连接 MySQL 查询上的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25917095/