php - 覆盖复杂连接 MySQL 查询上的字段

标签 php mysql sql join left-join

我有下面的查询,它是由 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/

相关文章:

php - 在 Laravel 5 中插入批处理

php - 同一页面上的多星评论

php - 使用 .csv 文件替换值

mysql - 高效地从 MySQL 查找日期范围

MySql on update 触发器。 DELIMITER 错误

mysql - 连接 2 个表的值并显示数据

sql - 从数据库中删除重复的行

php - 使用 Composer 安装后 laravel routes 文件夹丢失

php - 为普通 header 导入 html 文件无法读取 <head> 和相关的 javascript 和 css 源

PHP 插入或更新表格