MySQL使用CONCAT,JSON和IF语句进行高级多维查询

时间:2017-07-04 09:14:08

标签: php mysql json

我从数据库处理一个复杂的列表,并决定通过一个查询执行所有可能的请求。

以下是工作示例:

"SELECT
    `c`.`categories_id`,
    `c`.`categories_status`,
    IF(`c`.`categories_status` = 1, 'Active', 'Not Active') AS `categories_status_name`,
    TRIM(`cd`.`categories_name`) AS `categories_name`,
    TRIM(`cd`.`concert_date`) AS `concert_date`,
    TRIM(`cd`.`concert_time`) AS `concert_time`,
    TRIM((
        SELECT
            CONCAT(
                '{\"total_quantity\":',
                    SUM(CASE WHEN `p`.`products_quantity` > 0 THEN `p`.`products_quantity` ELSE 0 END),
                ',\"total_price\":\"',
                    SUM(`p`.`products_price`),
                '\"}'
            )
        FROM
            `products_to_categories` `ptc`,
            `products` `p`
        WHERE
            `ptc`.`section_id` = `cd`.`section_id`
        AND
            `p`.`products_id` = `ptc`.`products_id`
    )) AS `products_available`,
    TRIM((
        SELECT
            CONCAT(
                '{\"total_quantity\":',
                    SUM(CASE WHEN `op`.`products_quantity` > 0 THEN `op`.`products_quantity` ELSE 0 END),
                ',\"total_price\":\"',
                    SUM(`op`.`final_price`),
                '\"}'
            )
        FROM
            `products_to_categories` `ptc`,
            `orders_products` `op`
        WHERE
            `ptc`.`section_id` = `cd`.`section_id`
        AND
            `op`.`products_id` = `ptc`.`products_id`
        AND
            `op`.`orders_products_status` != 1
    )) AS `products_sold`,
    TRIM((
        SELECT
            CONCAT(
                '{\"total_quantity\":',
                    SUM(CASE WHEN `op`.`products_quantity` > 0 THEN `op`.`products_quantity` ELSE 0 END),
                ',\"total_price\":\"',
                    SUM(`op`.`final_price`),
                '\"}'
            )
        FROM
            `products_to_categories` `ptc`,
            `orders_products` `op`
        WHERE
            `ptc`.`section_id` = `cd`.`section_id`
        AND
            `op`.`products_id` = `ptc`.`products_id`
        AND
            `op`.`orders_products_status` = 1
    )) AS `products_pending`
FROM
    `categories` `c`,
    `categories_description` `cd`
WHERE
    `c`.`categories_id`  = `c`.`section_id`
AND
    `cd`.`categories_id`  = `c`.`categories_id`
GROUP BY `c`.`categories_id`
ORDER BY `c`.`categories_status` DESC;"

这项工作很棒但我的主要问题是如何检查自定义新字段的IF / ELSE或CASE WHEN:products_availableproducts_soldproducts_pending

问题是,如果表orders_products中不存在产品,我就不会获得生成的JSON,而且这在PHP内部发生了一些小冲突。

我可以在PHP中检查,但是想要避免使用该部分,只需打印JSON,如:

{"total_quantity":0,"total_price":"0.0000"}

1 个答案:

答案 0 :(得分:-1)

FROM
    `products_to_categories` `ptc`,
    `orders_products` `op`
    *

WHERE `products_id` = 
(SELECT COALESCE(`products_id`,0))

*
AND
    `ptc`.`section_id` = `cd`.`section_id`