Как правильно отфильтровать данные по значению в SQL
Составляю запрос:
SELECT
cfp.`id` AS id,
cfp.`user_id` AS user_id,
cfp.`order_id` AS order_id,
cfp.`coupon_id` AS coupon_id,
cfp.`created` AS created,
Max( CASE WHEN cm.`meta_key` = "discount_type" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS discount_type,
Max( CASE WHEN cm.`meta_key` = "coupon_amount" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS coupon_amount,
Max( CASE WHEN cm.`meta_key` = "free_shipping" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS free_shipping,
Max( CASE WHEN cm.`meta_key` = "date_expires" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS date_expires,
Max( CASE WHEN cm.`meta_key` = "minimum_amount" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS minimum_amount,
Max( CASE WHEN cm.`meta_key` = "maximum_amount" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS maximum_amount,
Max( CASE WHEN cm.`meta_key` = "individual_use" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS individual_use,
Max( CASE WHEN cm.`meta_key` = "exclude_sale_items" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS exclude_sale_items,
Max( CASE WHEN cm.`meta_key` = "product_ids" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS product_ids,
Max( CASE WHEN cm.`meta_key` = "exclude_product_ids" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS exclude_product_ids,
Max( CASE WHEN cm.`meta_key` = "product_categories" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS product_categories,
Max( CASE WHEN cm.`meta_key` = "exclude_product_categories" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS exclude_product_categories,
Max( CASE WHEN cm.`meta_key` = "customer_email" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS customer_email,
Max( CASE WHEN cm.`meta_key` = "usage_limit" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS usage_limit,
Max( CASE WHEN cm.`meta_key` = "usage_limit_per_user" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS usage_limit_per_user,
Max( CASE WHEN cm.`meta_key` = "usage_count" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS total_usaged
FROM `wp_coupon_for_purchase` AS cfp
LEFT JOIN `wp_postmeta` AS cm
ON cfp.`coupon_id` = cm.`post_id`
WHERE
/* Filter by date */
CASE
WHEN "2020-04-13" != "" THEN
DATE(created) = "2020-04-13"
ELSE
DATE(created) != ""
END
/* Filter by used */
AND
CASE
WHEN "used" = "used" THEN
total_usaged != 0
WHEN "used" = "not-used" THEN
total_usaged = 0
END
GROUP BY `id`
ORDER BY `id` DESC;
Получаю ошбику:
> 1054 - Unknown column 'total_usaged' in 'where clause'
По дате фильтрует как надо, так как колонка “created” реально существует. Нужно научить запрос фильтровать по “total_usaged”
Ответы (1 шт):
Автор решения: Andrew Skochelias
→ Ссылка
Переделал с помощью HAVING, все работает как нужно и намного проще чем через CASE
Рабочий вариант:
SELECT
cfp.`id` AS id,
cfp.`user_id` AS user_id,
cfp.`order_id` AS order_id,
cfp.`coupon_id` AS coupon_id,
cfp.`created` AS created,
Max( CASE WHEN cm.`meta_key` = "discount_type" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS discount_type,
Max( CASE WHEN cm.`meta_key` = "coupon_amount" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS coupon_amount,
Max( CASE WHEN cm.`meta_key` = "free_shipping" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS free_shipping,
Max( CASE WHEN cm.`meta_key` = "date_expires" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS date_expires,
Max( CASE WHEN cm.`meta_key` = "minimum_amount" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS minimum_amount,
Max( CASE WHEN cm.`meta_key` = "maximum_amount" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS maximum_amount,
Max( CASE WHEN cm.`meta_key` = "individual_use" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS individual_use,
Max( CASE WHEN cm.`meta_key` = "exclude_sale_items" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS exclude_sale_items,
Max( CASE WHEN cm.`meta_key` = "product_ids" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS product_ids,
Max( CASE WHEN cm.`meta_key` = "exclude_product_ids" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS exclude_product_ids,
Max( CASE WHEN cm.`meta_key` = "product_categories" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS product_categories,
Max( CASE WHEN cm.`meta_key` = "exclude_product_categories" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS exclude_product_categories,
Max( CASE WHEN cm.`meta_key` = "customer_email" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS customer_email,
Max( CASE WHEN cm.`meta_key` = "usage_limit" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS usage_limit,
Max( CASE WHEN cm.`meta_key` = "usage_limit_per_user" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS usage_limit_per_user,
Max( CASE WHEN cm.`meta_key` = "usage_count" AND cfp.`coupon_id` = cm.`post_id` THEN cm.`meta_value` END ) AS total_usaged
FROM `wp_coupon_for_purchase` AS cfp
LEFT JOIN `wp_postmeta` AS cm
ON cfp.`coupon_id` = cm.`post_id`
GROUP BY `id`
HAVING ( CASE @data
WHEN "2020-04-15" THEN
DATE(created) = "2020-04-15"
ELSE
DATE(created) = DATE(created)
END )
AND
( CASE @used
WHEN "used" THEN
`total_usaged` > 0
WHEN "not_used" THEN
`total_usaged` < 1
ELSE
`id` != ""
END )
ORDER BY `id` DESC;