gpt4 book ai didi

mysql - CASE 语句以及如何使用其中的值

转载 作者:行者123 更新时间:2023-11-29 11:46:16 26 4
gpt4 key购买 nike

我有一个疑问

select 
p.ID as order_id,
p.post_date,
i.order_item_id,
max( CASE WHEN im.meta_key = '_product_id' and i.order_item_id = im.order_item_id THEN im.meta_value END ) as product_id,
max( CASE WHEN im.meta_key = '_qty' and i.order_item_id = im.order_item_id THEN im.meta_value END ) as qty,
max( CASE WHEN prm.meta_key = '_sku' and im.meta_value = prm.post_id THEN prm.meta_value END ) as sku,
max( CASE WHEN prm.meta_key = '_regular_price' and im.meta_value = prm.post_id THEN prm.meta_value END ) as product_price
from
wp_posts as p,
wp_postmeta as pm,
wp_woocommerce_order_items as i,
wp_woocommerce_order_itemmeta as im,
wp_postmeta as prm
where
p.post_type = 'shop_order'
and p.ID = pm.post_id
and p.ID = i.order_id
and p.post_date BETWEEN '2016-01-14 00:00:00' AND '2016-01-14 23:59:59'
and p.post_status = 'wc-processing'
and p.ID = i.order_id
and i.order_item_id = im.order_item_id
group by
p.ID

但我坚持使用 product_id 获取 skuproduct_price (两个值均为 NULL),在 phpMyAdmin 上时我会这样做按其值搜索我可以获得 SKU 和产品价格 meta_value 以及位于 wp_postmeta 表中的 meta_key 的其他值。

根据下面的评论和答案中的有用指示,我进行了 JOIN 版本查询,该查询有效但速度很慢:

select 
p.ID as order_id,
p.post_date,
i.order_item_id,
max( CASE WHEN im.meta_key = '_product_id' THEN im.meta_value END ) as product_id,
max( CASE WHEN imq.meta_key = '_qty' THEN imq.meta_value END ) as qty,
max( CASE WHEN prm.meta_key = '_sku' THEN prm.meta_value END ) as sku,
max( CASE WHEN prm.meta_key = '_regular_price' THEN prm.meta_value END ) as product_price
from
wp_posts as p
join
wp_postmeta as pm
on
p.ID = pm.post_id
join
wp_woocommerce_order_items as i
on
p.ID = i.order_id
join
wp_woocommerce_order_itemmeta as im
on
i.order_item_id = im.order_item_id
join
wp_woocommerce_order_itemmeta as imq
on
i.order_item_id = imq.order_item_id
join
wp_postmeta as prm
on
im.meta_value = prm.post_id
where
p.post_type = 'shop_order'
and p.post_date BETWEEN '2016-01-14 00:00:00' AND '2016-01-14 23:59:59'
and p.post_status = 'wc-processing'
group by
p.ID

我的问题是为什么我需要为每个 CASE 语句创建 JOIN - 例如 qty 的其他方式返回值为 NULL。

最佳答案

wp_postmeta(查询中的别名 prm)的连接中似乎没有任何谓词。因此这是一个交叉连接操作。执行交叉连接是有效的;但这不太可能是您想要的结果。

放弃连接操作的老式逗号语法。使用 ANSI JOIN 关键字。并将连接谓词从 WHERE 子句重新定位到适当的 ON 子句。

CASE 表达式中的一些条件测试是不必要的,因为它们是多余的。他们将始终评估为 TRUE。

查询包含此连接谓词(在 WHERE 子句中)

i.order_item_id = im.order_item_id

相同的条件再次出现在 CASE 表达式中:

CASE WHEN im.meta_key = '_product_id' and i.order_item_id = im.order_item_id THEN

无需在 CASE 表达式中重复该条件,因为对于返回的每一行,其计算结果均为 TRUE。

CASE WHEN im.meta_key = '_product_id' THEN
<小时/>

给定连接到 wp_postmeta 的“缺​​失”连接谓词(别名为 prm)...并给定我们在其他 CASE 表达式中看到的条件

im.meta_value = prm.post_id

我们怀疑您希望将该条件包含为连接谓词。

缺少示例行,我们只是猜测。我对您想要实现的目标的猜测是这样的结果:

SELECT p.id as order_id
, p.post_date
, i.order_item_id
, MAX( CASE WHEN im.meta_key = '_product_id' THEN im.meta_value END ) as product_id
, MAX( CASE WHEN im.meta_key = '_qty' THEN im.meta_value END ) as qty
, MAX( CASE WHEN prm.meta_key = '_sku' THEN prm.meta_value END ) as sku
, MAX( CASE WHEN prm.meta_key = '_regular_price' THEN prm.meta_value END ) as product_price
FROM wp_posts p
JOIN wp_postmeta pm
ON pm.post_id = p.ID
JOIN wp_woocommerce_order_items i
ON i.order_id = p.ID
JOIN wp_woocommerce_order_itemmeta im
ON im.order_item_id = i.order_item_id
JOIN wp_postmeta as prm
ON prm.post_id = im.meta_value
WHERE p.post_type = 'shop_order'
AND p.post_status = 'wc-processing'
AND p.post_date >= '2016-01-14'
AND p.post_date < '2016-01-15'
GROUP BY p.ID

这没有考虑到 prm 中“丢失”行的可能性,也许您想使用外连接操作。

由于 SELECT 列表中有 i.order_item_id,并且 CASE 表达式从 im 返回值,看起来您可能希望包含 i.order_item_id GROUP BY 子句中。

但同样,这些只是猜测。

关于mysql - CASE 语句以及如何使用其中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34882950/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com