Как объединить поля?

#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