データベースから複雑なリストを作成し、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_available
、products_sold
とproducts_pending
?
テーブル内に製品が存在しない場合は、orders_products
私は生成されたJSONを取得せず、PHP内で小さな矛盾が生じます。
私はPHPでチェックするが、その部分を避けて、同じようにJSONを印刷することが可能です。
{"total_quantity":0,"total_price":"0.0000"}
ありがとう!
たとえば、for-products_availableのようにカスタムフィールドをテストしたいというサンプル条件を教えてください。 –
問題は、製品が 'orders_products'テーブルの中に存在しない場合、' products_available'からJSONを生成しないということです。私は空のフィールドだけを取得します。 '{" total_quantity ":0、" total_price ":" 0.0000 "}'のような空のフィールドJSONをインスタンス化する必要があります。それだけの理由です。 –