我有下面的查询,它是由一个PHP函数生成的,它变得非常复杂,但它迄今为止工作正常。复杂的字段加入MySQL查询
我想要做的就是由第二场覆盖一个场如果第三场等于1
所以我想表2 .cpda_meta_val实际上等于表3 .cpda_meta_val当表4 .cpda_meta_val等于1,这样我就可以在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
我认为第一件事 - 就是将复杂和难以理解的视为可理解的名称和含义,可以应用一些覆盖。然后重写查询,只使用必填字段并对其进行最小更改。 – 2014-09-18 15:48:21
我认为VIEWs对于这种看法来说是过分的,因为查询是通过代码生成的并且基本上是自动的。我现在使用下面的答案作为发电机弓的另一个可以说。 – bbeckford 2014-09-19 09:18:14