2017-07-04 101 views
0

我从数据库处理一个复杂列表,并决定通过一个查询完成所有可能的请求。使用CONCAT,JSON和IF语句的MySQL高级多维查询

这里是工作示例:

"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时自定义的新领域:products_availableproducts_soldproducts_pending

问题是,如果产品不存在于表orders_products内部,我没有得到我生成的JSON,这在PHP中造成了一个小冲突。

我可以做什么检查在PHP,但要避免部分,只是打印JSON,如:

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

谢谢!

+0

您能否告诉我们您想要测试自定义字段的一个示例条件,比如for- products_available? –

+0

问题是,如果产品不存在于表orders_products中,我不会从'products_available'生成JSON。我只得到空场。我需要有像'{“total_quantity”:0,“total_price”:“0.0000”}'这样的空字段JSON。这是唯一的原因。 –

回答

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

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

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

请在您的答案中加入解释。 StackOverflow的目标不仅是提供解决方案,而且解释也是如此。 –

+0

COALESCE接受两个参数并返回非空的第一个参数。 –