【问题标题】:Wordpress SQL query the user's first & last name for product X?Wordpress SQL 查询产品 X 的用户名和姓氏?
【发布时间】:2016-08-27 16:10:49
【问题描述】:

我正在创建一个 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 毫秒,因此我非常愿意接受任何改进此代码的建议。话虽如此,我认为我必须进行另一个查询才能获得last_name 使其成为嵌套查询。如果我在 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 附近使用正确的语法,(SELECT wp_usermeta.user_id, wp_usermeta.meta_value AS 'first' at line 22

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


更新

根据@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 中却不行。我收到此错误:

“有子句”中的未知列“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 成功了。没有分组。查询结果出现在 127.76 毫秒内。这是我的查询:

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

【问题讨论】:

  • 顺便说一句,您的查询假定所有元键都已填充。这对于名字和姓氏之类的东西很可能是正确的,但对于其他元键可能不是这样 - 在这种情况下,INNER JOIN 将省略该客户,而应该使用 OUTER JOIN。
  • 那些看起来不像我的查询。我从来没有将first.meta_key = 'first_name' 放在HAVING 子句或WHERE 或那么多括号之间。认真地去掉所有的括号,这不是代数他们无所谓。像我一样把它们放在join中,它会让你的查询更快更清晰。
  • @Hogan 好的。我会照办的。感谢您的帮助!

标签: mysql sql wordpress select woocommerce


【解决方案1】:

添加此连接

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',

您可能不需要对() 如此疯狂——顺序无关紧要,除非您正在执行子查询(您不是)或混合左右连接(您不是) t)。

【讨论】:

  • 感谢您的快速响应。我在哪里添加此代码?我不断收到语法错误。你能提供整个查询,以便我有一个概述吗?再次感谢:)
  • 我没有一个 mysql 来测试我的语法,这里发生了火灾——如果我能找到这 16​​0 万行缺失的行,我会在几分钟内试一试。跨度>
  • @AvaBarbilla 看起来像 aaron D 有你。
【解决方案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'

【讨论】:

  • 我将代码粘贴到 My Web SQL 中,但它不起作用。我得到:“字段列表”中的未知列“wo.order_item_name”
  • @AvaBarbilla 哎呀,别名错误。已修复,但看起来你可以正常工作了:D
猜你喜欢
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多