在MySql中获取两列并乘以结果

时间:2014-06-05 10:44:50

标签: php mysql wordpress

好吧,我有以下内容:

user id    meta
   2      _qty      3
   2      Weight    20
   1      _qty      1
   1      weight    30

我需要获取用户ID列,然后将qty乘以权重,给出用户ID为2 = 60和用户id = 1 30 ...... 我尝试过以下但无济于事:

 $myrows = $wpdb->get_results( "SELECT meta_value, SUM(_qty*weight) AS product_id FROM {$wpdb->prefix}woocommerce_order_itemmeta GROUP BY ($query_select_order_items)" );

其中($query_select_order_items)是user_id。 我该怎么做呢?

我当前正在运行的实际php:

/**
 * Returns all the orders made by the user
 *
 * @param int $user_id
 * @param string $status (completed|processing|canceled|on-hold etc)
 * @return array of order ids
 */
function fused_get_all_user_orders($user_id,$status='completed'){
    if(!$user_id)
        return false;

    $orders=array();//order ids

    $args = array(
        'numberposts'     => -1,
        'meta_key'        => '_customer_user',
        'meta_value'      => $user_id,
        'post_type'       => 'shop_order',
        'post_status'     => 'publish',
       /* 'tax_query'=>array(
                array(
                    'taxonomy'  =>'shop_order_status',
                    'field'     => 'slug',
                    'terms'     =>$status
                    )
        )  */
    );

    $posts=get_posts($args);
    //get the post ids as order ids
    $orders=wp_list_pluck( $posts, 'ID' );

    return $orders; 
}
function fused_get_all_products_ordered_by_user($user_id=false){

 $orders=fused_get_all_user_orders($user_id);
 if(empty($orders))
   return false;

 $order_list='('.join(',', $orders).')';//let us make a list for query

 //so we have all the orders made by this user which was successfull

 //we need to find the products in these order and make sure they are downloadable

 // find all products in these order

 global $wpdb;
 $query_select_order_items="SELECT order_item_id as id FROM {$wpdb->prefix}woocommerce_order_items WHERE order_id IN {$order_list}";

 $query_select_product_ids="SELECT meta_value as product_id FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE meta_key=%s AND order_item_id IN ($query_select_order_items)";


 $products=$wpdb->get_col($wpdb->prepare($query_select_product_ids,'weight'));

 $qty = $wpdb->get_col($wpdb->prepare($query_select_product_ids,'_qty'));


 return $products;
}

目前最终$ product的产品返回一个权重列表,或者如果我将其设置为_qty,它将返回订购数量的列表... sqlfiddle

草莓更新答案:

"SELECT order_item_id, weight * quantity total FROM ( 
 SELECT order_item_id, 
   MAX(CASE WHEN meta_key = '_qty' THEN meta_value ELSE 0 END) quantity , 
   MAX(CASE WHEN meta_key = 'weight' THEN meta_value ELSE 0 END) weight 
   FROM wp_woocommerce_order_itemmeta GROUP BY order_item_id) 
   WHERE  order_item_id  IN ($query_select_order_items) x;"

3 个答案:

答案 0 :(得分:1)

SELECT A.user_id, 
       SUM(A.meta_value * B.meta_value) 
FROM   t A INNER JOIN t B ON A.user_id = B.user_id 
WHERE  A.meta = 'weight'
   AND B.meta = '_qty'
GROUP BY 
       A.user_id

您可以在此fiddle

中试用

答案 1 :(得分:1)

您可以使用此查询:

select tbl1.val*tbl2.val
from mytbl as tbl1,mytbl as tbl2
where tbl1.user_id=tbl2.user_id
and tbl2.meta='Weight'
and tbl1.meta='_qty'

我也准备fiddle of it

答案 2 :(得分:1)

这是一种方式......

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(entity INT NOT NULL
,attribute VARCHAR(12) NOT NULL
,value INT NOT NULL
,PRIMARY KEY(entity,attribute)
);

INSERT INTO my_table VALUES
(2,'quantity',3),
(2,'weight',20),
(1,'quantity',1),
(1,'weight',30);

SELECT entity, weight * quantity total
  FROM 
     ( SELECT entity
            , MAX(CASE WHEN attribute = 'quantity' THEN value END) quantity
            , MAX(CASE WHEN attribute = 'weight' THEN value END) weight
         FROM my_table
        GROUP
           BY entity
     ) x;

+--------+-------+
| entity | total |
+--------+-------+
|      1 |    30 |
|      2 |    60 |
+--------+-------+  

......甚至只是......

SELECT entity 
     , ROUND(EXP(SUM(LOG(value)))) total 
  FROM my_table 
 GROUP 
    BY entity;
+--------+-------+
| entity | total |
+--------+-------+
|      1 |    30 |
|      2 |    60 |
+--------+-------+  

将第一个查询调整到您的小提琴可能看起来像这样......

SELECT order_item_id, weight * quantity total
  FROM 
     ( SELECT order_item_id
            , MAX(CASE WHEN meta_key = '_qty' THEN meta_value ELSE 0 END) quantity
            , MAX(CASE WHEN meta_key = 'weight' THEN meta_value ELSE 0 END) weight
         FROM wp_woocommerce_order_itemmeta
        GROUP
           BY order_item_id
     ) x;

......第二个可能看起来像......

SELECT order_item_id
     , ROUND(EXP(SUM(LOG(meta_value)))) total 
  FROM wp_woocommerce_order_itemmeta
 WHERE meta_key IN('_qty','weight')
 GROUP 
    BY order_item_id;

......并根据您的最新要求调整第一个......

SELECT i.order_item_id, weight * quantity total
  FROM 
     ( SELECT order_item_id 
            , MAX(CASE WHEN meta_key = '_qty' THEN meta_value ELSE 0 END) quantity
            , MAX(CASE WHEN meta_key = 'weight' THEN meta_value ELSE 0 END) weight
         FROM wp_woocommerce_order_itemmeta
        GROUP
           BY order_item_id 
     ) x
  JOIN wp_woocommerce_order_items i
    ON i.order_item_id = x.order_item_id
 WHERE i.order_id IN(647,649,650);