2017-07-04 41 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接受兩個參數並返回非空的第一個參數。 –