#mysql #woocommerce #group-by
#mysql #woocommerce #группировка по
Вопрос:
У меня есть этот запрос
SELECT DISTINCT wp_posts.ID, wp_posts.post_excerpt, wp_posts.post_name, wp_posts.guid,
(CASE WHEN wp_postmeta.meta_key = 'product_ids' AND wp_posts.`ID` = wp_postmeta.`post_id` THEN wp_postmeta.`meta_value` END) AS 'product_ids',
(CASE WHEN wp_postmeta.meta_key = 'coupon_amount' AND wp_posts.`ID` = wp_postmeta.`post_id` THEN wp_postmeta.`meta_value` END) AS 'coupon_amount',
(CASE WHEN wp_postmeta.meta_key = 'discount_type' AND wp_posts.`ID` = wp_postmeta.`post_id` THEN wp_postmeta.`meta_value` END) AS 'discount_type',
(CASE WHEN wp_postmeta.meta_key = 'free_shipping' AND wp_posts.`ID` = wp_postmeta.`post_id` THEN wp_postmeta.`meta_value` END) AS 'free_shipping',
(CASE WHEN wp_postmeta.meta_key = 'expiry_date' AND wp_posts.`ID` = wp_postmeta.`post_id` THEN wp_postmeta.`meta_value` END) AS 'expiry_date'
FROM wp_posts
RIGHT JOIN wp_postmeta
ON wp_posts.ID = wp_postmeta.post_id
WHERE wp_posts.post_type = 'shop_coupon' AND wp_postmeta.meta_key IN ('discount_type','coupon_amount', 'product_ids')
Таким образом, я могу получить название купона, его сумму и тип скидки, но запрос показывает мне следующее:
[]
Как я могу сделать так, чтобы все отображалось в 1 отдельной строке? Вот так:
[]
И что важно, мне также нужно отфильтровать его по идентификатору продукта, на фотографии вы можете видеть, что идентификатор равен 725
Ответ №1:
Для этого примера данных вы можете сделать это с помощью агрегации:
SELECT wp_posts.ID, wp_posts.post_excerpt, wp_posts.post_name, wp_posts.guid,
MAX(CASE WHEN wp_postmeta.meta_key = 'product_ids' AND wp_posts.`ID` = wp_postmeta.`post_id` THEN wp_postmeta.`meta_value` END) AS product_ids,
MAX(CASE WHEN wp_postmeta.meta_key = 'coupon_amount' AND wp_posts.`ID` = wp_postmeta.`post_id` THEN wp_postmeta.`meta_value` END) AS coupon_amount,
MAX(CASE WHEN wp_postmeta.meta_key = 'discount_type' AND wp_posts.`ID` = wp_postmeta.`post_id` THEN wp_postmeta.`meta_value` END) AS discount_type,
MAX(CASE WHEN wp_postmeta.meta_key = 'free_shipping' AND wp_posts.`ID` = wp_postmeta.`post_id` THEN wp_postmeta.`meta_value` END) AS free_shipping,
MAX(CASE WHEN wp_postmeta.meta_key = 'expiry_date' AND wp_posts.`ID` = wp_postmeta.`post_id` THEN wp_postmeta.`meta_value` END) AS expiry_date
FROM wp_posts RIGHT JOIN wp_postmeta
ON wp_posts.ID = wp_postmeta.post_id
WHERE wp_posts.post_type = 'shop_coupon'
AND wp_postmeta.meta_key IN ('discount_type','coupon_amount', 'product_ids')
GROUP BY wp_posts.ID, wp_posts.post_excerpt, wp_posts.post_name, wp_posts.guid
Также с этим условием:
wp_posts.post_type = 'shop_coupon'
поскольку это применяется в WHERE
предложении, вы фактически выполняете INNER
объединение вместо RIGHT
объединения.
Если это не то, что вы хотите, переместите это в ON
предложение:
FROM wp_posts RIGHT JOIN wp_postmeta
ON wp_posts.ID = wp_postmeta.post_id AND wp_posts.post_type = 'shop_coupon'
WHERE wp_postmeta.meta_key IN ('discount_type','coupon_amount', 'product_ids')
Кроме того, если вы действительно хотите INNER
присоединиться, то это условие:
AND wp_posts.`ID` = wp_postmeta.`post_id`
внутри CASE
выражений не требуется, потому что это так true
, поскольку оно применяется в ON
предложении.
Комментарии:
1. Большое тебе спасибо, друг!! И как мне указать meta_key, чтобы определить, является ли значение ‘product_ids’, и meta_value, чтобы определить, равно ли значение 725 (это будет product_id). таким образом, чтобы иметь возможность идентифицировать купоны для каждого продукта
2. Условие for
'product_ids'
включено в список оператора IN, если это то, что вы спрашиваете. Кроме того, функция MAX() при применении к таким значениям, как null, null, 725, вернет 725.3. Я хотел бы показать только купоны, созданные для каждого продукта, пример: для продукта 725 = 2 купона для продукта 687 = 1 купон
4. Это то, что вы получаете с помощью этого запроса: для продукта 725 = 2 купона, для продукта 687 = 1 купон, как я вижу в результатах вашего запроса, если все 4 столбца: wp_posts . ID, wp_posts.post_excerpt, wp_posts.post_name, wp_posts.guid имеют одинаковые значения.
5. Правильно, но там я показываю все купоны, но как мне показывать только купоны для каждого product_id. Например, если кто-то зайдет, чтобы посмотреть продукт 725, я покажу им только 2 купона. Если кто-то пойдет посмотреть продукт 687, он увидит только 1 купон. Это я показываю с помощью php