Wordpress SQL查询用户的第一个&产品X的姓氏?

时间:2016-05-02 19:27:55

标签: mysql sql wordpress select woocommerce

我正在创建一个SQL查询,我想显示从woocommerce商店购买可下载产品的客户的全名和电子邮件。我正在寻找这样的东西:

user_id    first_name    last_name    user_email    order
---------------------------------------------------------
1          Peter         Jones        a12@gmail     Doc_1

在上表中, Doc_1 代表产品名称,在这种情况下, user_id = 1 的客户可以下载 Doc_1 。对于wordpress用户,您知道表wp_usermeta包含所有用户的信息,如下所示:

umeta_id    user_id    meta_key    meta_value
---------------------------------------------
1           1          nickname    petjon123
2           1          first_name  Peter
3           1          last_name   Jones
...         ...        ...         ...

此列表包含更多meta_value[s],包括电子邮件等。如果meta_key[s]表格标题显示first_namelast_name旁边,那么一切都会容易得多。彼此而不是彼此。我到目前为止,我的查询显示first_name,但我无法获得last_name。我的SQL查询如下所示:

SELECT
  wp_usermeta.user_id,
  wp_usermeta.meta_value AS 'first_name',
  Wp_woocommerce_downloadable_product_permissions_1.user_email AS 'email',
  Wp_woocommerce_order_items_1.order_item_name AS 'order'
FROM Wp_woocommerce_order_items
     INNER JOIN Wp_woocommerce_downloadable_product_permissions
       ON Wp_woocommerce_order_items.order_id = Wp_woocommerce_downloadable_product_permissions.order_id,
     (Wp_woocommerce_order_items AS Wp_woocommerce_order_items_1
     INNER JOIN Wp_woocommerce_downloadable_product_permissions AS Wp_woocommerce_downloadable_product_permissions_1
       ON Wp_woocommerce_order_items_1.order_id = Wp_woocommerce_downloadable_product_permissions_1.order_id)
     INNER JOIN wp_usermeta
       ON Wp_woocommerce_downloadable_product_permissions_1.user_id = wp_usermeta.user_id
GROUP BY wp_usermeta.user_id,
         wp_usermeta.meta_value,
         Wp_woocommerce_downloadable_product_permissions_1.user_email,
         Wp_woocommerce_order_items_1.order_item_name,
         Wp_woocommerce_order_items_1.order_item_type,
         wp_usermeta.meta_key
HAVING (((Wp_woocommerce_order_items_1.order_item_type) = 'line_item')
AND ((wp_usermeta.meta_key) = 'first_name'));

给我这个结果:

user_id    first_name    user_email    order
--------------------------------------------
1          Peter         a12@gmail     Doc_1

我手动检查了这些值,但它们是正确的,但是,我必须说如果我没有 GROUP 结果,我会得到1000倍的结果,所以 GROUPING 数据通过基本上删除显然过多的重复项简化了结果。我怀疑这个查询是有效的,因为直到结果出现的执行时间是+/- 20368.14 ms ,因此我对任何改进此代码的建议都非常开放。有了这个说法,我认为我必须再做一个查询才能让last_name成为 NESTED QUERY 。如果我在MS Access中打开表,创建让我们说 Query1 这是上面的查询,并将 Query1 与表格一起加入我得到的结果。这个的SQL代码如下:

SELECT
  Query1.user_id,
  Query1.first_name,
  wp_usermeta.meta_value AS 'last_name',
  Query1.user_email,
  Query1.order_item_name
FROM wp_usermeta
INNER JOIN Query1
  ON wp_usermeta.user_id = Query1.user_id
WHERE (((wp_usermeta.meta_value) <> '')
AND ((wp_usermeta.meta_key) = 'last_name'));

我尝试使用括号替换 Query1 替换第二个查询,方法是将 Query1 中的代码括起来,但这不起作用。我收到这个错误:

您的SQL语法出错;查看与您的MySQL服务器版本对应的手册,以便在'.user_id附近使用正确的语法,(在第22行选择wp_usermeta.user_id,wp_usermeta.meta_value AS'第一'

有人知道怎么做吗?谢谢!

更新

根据@Hogan提供的答案,我想出了这个:

SELECT
  first.user_id,
  first.meta_value AS 'first_name',
  last.meta_value AS 'last_name',
  Wp_woocommerce_downloadable_product_permissions_1.user_email,
  Wp_woocommerce_order_items_1.order_item_name
FROM Wp_woocommerce_order_items
     INNER JOIN Wp_woocommerce_downloadable_product_permissions
       ON Wp_woocommerce_order_items.order_id = Wp_woocommerce_downloadable_product_permissions.order_id,
     wp_usermeta AS last
     INNER JOIN ((Wp_woocommerce_order_items AS Wp_woocommerce_order_items_1
     INNER JOIN Wp_woocommerce_downloadable_product_permissions AS Wp_woocommerce_downloadable_product_permissions_1
       ON Wp_woocommerce_order_items_1.order_id = Wp_woocommerce_downloadable_product_permissions_1.order_id)
     INNER JOIN wp_usermeta AS first
       ON Wp_woocommerce_downloadable_product_permissions_1.user_id = first.user_id)
       ON last.user_id = Wp_woocommerce_downloadable_product_permissions_1.user_id
GROUP BY first.user_id,
         first.meta_value,
         last.meta_value,
         Wp_woocommerce_downloadable_product_permissions_1.user_email,
         Wp_woocommerce_order_items_1.order_item_name,
         Wp_woocommerce_order_items_1.order_item_type,
         first.meta_key,
         last.meta_key
HAVING (((Wp_woocommerce_order_items_1.order_item_type) = 'line_item')
AND ((first.meta_key) = 'first_name')
AND ((last.meta_key) = 'last_name'));

在MS Access中可以正常工作,但在SQL中却没有。我收到了这个错误:

'having clause'中的未知列'first.meta_key'

为什么?

我还要提一下,当我将meta_key[s]添加到SELECT时,就像这样:

SELECT
  first.user_id,
  first.meta_value AS 'first_name',
  last.meta_value AS 'last_name',
  Wp_woocommerce_downloadable_product_permissions_1.user_email,
  Wp_woocommerce_order_items_1.order_item_name,
  first.meta_key,
  last.meta_key

我至少没有收到任何错误,查询正在运行,但是由于我正在使用本地主机,它会继续大幅增加我的CPU使用率。

SELECT DISTINCT完成了这个伎俩。否 GROUPING 。查询结果显示在 127.76 ms 中。这是我的问题:

SELECT DISTINCT
  first.user_id AS 'id',
  first.meta_value AS 'first_name',
  last.meta_value AS 'last_name',
  Wp_woocommerce_downloadable_product_permissions_1.user_email AS 'email',
  Wp_woocommerce_order_items_1.order_item_name AS 'order'
FROM Wp_woocommerce_order_items
     INNER JOIN Wp_woocommerce_downloadable_product_permissions
       ON Wp_woocommerce_order_items.order_id = Wp_woocommerce_downloadable_product_permissions.order_id,
     ((Wp_woocommerce_order_items AS Wp_woocommerce_order_items_1
     INNER JOIN Wp_woocommerce_downloadable_product_permissions AS Wp_woocommerce_downloadable_product_permissions_1
       ON Wp_woocommerce_order_items_1.order_id = Wp_woocommerce_downloadable_product_permissions_1.order_id)
     INNER JOIN wp_usermeta AS first
       ON Wp_woocommerce_downloadable_product_permissions_1.user_id = first.user_id)
     INNER JOIN wp_usermeta AS last
       ON Wp_woocommerce_downloadable_product_permissions_1.user_id = last.user_id
WHERE (((first.meta_key) = 'first_name')
AND ((last.meta_key) = 'last_name')
AND ((Wp_woocommerce_order_items_1.order_item_type) = 'line_item'));

正如@Hogan所说,只需再次使用其他别名添加表wp_usermeta,然后制作INNER JOIN

2 个答案:

答案 0 :(得分:2)

添加此联接

INNER JOIN wp_usermeta AS last 
    ON Wp_woocommerce_downloadable_product_permissions_1.user_id = last.user_id AND last.meta_key = 'last_name'

和列

last.meta_value AS 'last_name',

你可能不需要对()这么疯狂 - 顺序没关系,除非你正在做一个子查询(你不是)或混合左右连接(你的都没有)。

答案 1 :(得分:2)

试试这个:

SELECT DISTINCT
  pp.user_id,
  first.meta_value AS 'first_name',
  last.meta_value AS 'last_name',
  pp.user_email AS 'email',
  oi.order_item_name AS 'order'
FROM
  Wp_woocommerce_order_items oi
INNER JOIN
  Wp_woocommerce_downloadable_product_permissions pp ON pp.order_id = oi.order_id
INNER JOIN
  wp_usermeta first ON first.user_id = pp.user_id
INNER JOIN
  wp_usermeta last ON last.user_id = pp.user_id
WHERE first.meta_key = 'first_name'
AND last.meta_key = 'last_name'
AND oi.order_item_type = 'line_item'