回答

收藏

SQL在列上选择具有最大值的JOIN中的行

技术问答 技术问答 275 人阅读 | 0 人回复 | 2023-09-12

我正在从 3 的不同表中选择值来概述一些产品订单。MAX,没有问题。
7 H+ c8 H+ A* X6 U. n) f% c, s' z3 x这是我正在使用的数据:
! R" \$ J9 M9 m: F- \-- limited to first rows for the sake of the exemple ------ --------------------- ------------------------------- ------- | ID   | post_date           | order_item_name               | price | ------ --------------------- ------------------------------- ------- | 2348 | 2019-01-23 18:47:34 | product A                     | 18.9  || 2348 | 2019-01-23 18:47:34 | Product B                     | 4.5   || 2348 | 2019-01-23 18:47:34 | Product C                     | 50.5  || 2349 | 2019-01-23 21:59:04 | Product E                     | 26.5  || 2352 | 2019-01-24 07:41:12 | Product C                     | 50.5  | ------ --------------------- ------------------------------- ------- 以下是 SQL 查询返回。1 I0 \  ^) r# }
SELECT     p.ID AS order_id,   post_date,   order_item_name,   meta_value as priceFROM wp_posts AS pJOIN wp_woocommerce_order_itemsON p.ID = order_idJOIN wp_woocommerce_order_itemmetaON wp_woocommerce_order_items.order_item_id = wp_woocommerce_order_itemmeta.order_item_idWHERE     post_type = 'shop_order     AND post_status = 'wc-completed'    AND meta_key = '_line_subtotal';我现在想要的是只从每个订单中获得最昂贵的产品。显然,只使用MAX函数 withGROUP BY每个订单返回一行,但产品名称与价格不匹配。% g, k$ p" X* h2 o4 d4 P% X9 l
SELECT     p.ID AS order_id,   post_date,   order_item_name,   MAX(meta_value) AS priceFROM alpha_posts AS pJOIN alpha_woocommerce_order_itemsON p.ID = order_idJOIN alpha_woocommerce_order_itemmetaON alpha_woocommerce_order_items.order_item_id = alpha_woocommerce_order_itemmeta.order_item_idWHERE     post_type = 'shop_order     AND post_status = 'wc-completed'    AND meta_key = '_line_subtotal'GROUP BY order_id;这将回到最高价格,但应该是order_item_name 列与给定价格不对应。
  ]3 S8 r3 F, k0 _7 S1 h  J    so it's clearly not matching (same for the following results)|     2352               2352| 2019-01-24 07:41:12 | Product A                     | 60.9  ||   | 2019-01-25 07:43:36 | Product C                     | 23.1  ||     235555                            555555| 2019-01-26 19:59:31 | Product D                     | 79.9  | ---------- --------------------- ------------------------------- ------- so it's clearly not matching (same for the following results)|     2352 | 2019-01-24 07:41:12 | Product A                     | 60.9  ||     2354 | 2019-01-25 07:43:36 | Product C                     | 23.1  ||     2355 | 2019-01-26 19:59:31 | Product D                     | 79.9  | ---------- --------------------- ------------------------------- ------- 我试图找到单表查询的例子,但我对这个多连接查询无能为力。9 \& C2 C& N+ k7 P) r& f8 }( _# i
                                                               
% U$ Y2 a# {+ ]% _! B5 a% s6 O    解决方案:                                                               
& h' }- m* a5 x4 @* E                                                                不出所料,聚合函数可以在不考虑其他列的情况下在一个列上工作,它们不是过滤器。
( P: [8 p; ~: n! o, e3 W这就是为什么MAX函数返回指定列中遇到的最大值,而其他列不对应于选定的最大值(或聚合函数的任何结果)。3 y" k- }' N9 h+ M. n
我们可以根据最大值选择匹配列JOIN查询,在我们的例子中,连接 onorder_id和price。) F( F+ V; ~5 e3 d* y7 [1 D* y0 d
SELECT     ID,    post_date,   wp_woocommerce_order_items.order_item_name,   wp_woocommerce_order_itemmeta.meta_valueFROM wp_postsJOIN wp_woocommerce_order_itemsON ID = order_idJOIN wp_woocommerce_order_itemmetaON wp_woocommerce_order_items.order_item_id = wp_woocommerce_order_itemmeta.order_item_idJOIN  SELECT        order_id,       MAX(meta_value) as price    FROM wp_woocommerce_order_items    JOIN wp_woocommerce_order_itemmeta    ON wp_woocommerce_order_items.order_item_id = wp_woocommerce_order_itemmeta.order_item_id    WHERE meta_key = '_line_subtotal'    GROUP BY order_id) bON ID = b.order_id AND wp_woocommerce_order_itemmeta.meta_value = priceWHERE     post_type = 'shop_order     AND post_status = 'wc-completed'    AND meta_key = '_line_subtotal
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则