2017-07-04 7 views
0

データベースから複雑なリストを作成し、1つのクエリですべての可能な要求を行うことにしました。この作品は素晴らしいMySQL CONCAT、JSON、IFのStatemantを使用した高度な多次元クエリ

"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"} 

ありがとう!

+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は2つの引数をとり、最初の引数がnullでないものを返します。 –