Как правильно отфильтровать данные по значению в 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;
→ Ссылка