2014-06-05 36 views
3

好吧,我有以下几点:得到两列在MySQL和繁殖的结果

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

我需要获取用户ID栏然后由权重赋予我的用户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; 
} 

凡目前到底是$产品返回重的列表,或者如果我将其设置为_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;" 
+0

尝试此查询' “选择meta_value,_qty *体重从table_name的GROUP BY”。$ query_select_order_items' – krishna

+0

这不工作... – vimes1984

+1

你确定你每个用户只有一个'_qty'和'weight'吗? –

回答

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); 
+0

这种类型的先生是天才谢谢你..... 你有什么想法我会如何将它结合到它:“SELECT order_item_id作为id从{$ wpdb->前缀} woocommerce_order_items WHERE order_id IN {$ order_list} “ 其中order_list是我需要的ID实际订单... – vimes1984

+0

HAhahaha确定它只是我一直在这一整个上午奋斗,而我在我的最后... – vimes1984

+0

这是什么结束X为? – vimes1984

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

+0

好吧我不知道我需要在这里取代所以它适用于我的代码..我在哪里输入$ query_select_order_items – vimes1984

+0

@ vimes1984我不明白你的评论。您可以从小提琴中看到查询返回的内容。我想你只需要将表名从t更改为yourTableName,然后在php中获取结果以获取user_id和计算的字段值。不是吗? – kiks73

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

+0

我还在我的实际表格中添加了一个提琴... http://sqlfiddle.com/#!2/10138 – vimes1984

+0

@ vimes1984哪一个是您想要的表格来执行操作? –

+0

wp_woocommerce_order_itemmeta – vimes1984