2017-05-16 188 views
0

我一直在试图为woocommerce组织一个SQL查询,它抓取并组织woocommerce_order_itemmeta表中的所有数据。SQL子查询返回空值行

我拼凑起来的基础上用于抓取重力类似的查询如下形式的散列值:

SELECT order_item_id AS entryId, 
    (
     SELECT meta_value 
     FROM wp_woocommerce_order_itemmeta 
     WHERE meta_key = 'Name' 
      AND order_item_id = entryId LIMIT 1 
     ) AS 'Full Name', 
    (
     SELECT meta_value 
     FROM wp_woocommerce_order_itemmeta 
     WHERE meta_key = 'Email' 
      AND order_item_id = entryId LIMIT 1 
     ) AS 'User Email', 
    (
     SELECT meta_value 
     FROM wp_woocommerce_order_itemmeta 
     WHERE meta_key = 'Address' 
      AND order_item_id = entryId LIMIT 1 
     ) AS 'User Address' 
FROM wp_woocommerce_order_itemmeta 
WHERE meta_value IS NOT NULL 
GROUP BY entryId 
ORDER BY entryId 

它似乎运行正常。我已经通过MySQL运行它,并且得到了我需要的结果,但是我也得到了许多只有NULL值的行。

有没有办法用上述查询过滤掉只有NULL值的行?

+1

您正在检查where子句中的空值,但那是在您已经加入所有内容之后。添加meta_value对于每个联接都不为NULL的地方应该修复它。不确定在mysql中是否有更好的方法。 –

+0

添加'where ...和entryId不为空'。另外它不应该有可能具有多个空'entryId'的行。尽管有些系统弯曲该规则,但子查询中的order_item_id = null严格不可行。 – shawnt00

+0

谢谢你的建议。我试图给每个子查询添加“where meta_value is not null”,但它仍然成功运行,但仍然看到许多返回的NULL行。我发现它与没有名称,电子邮件地址等的entryID行有关,而只是包含_product_id,_line_subtotal,_line_total等的值。我将尝试查看是否我可以将它们按照_original_order_id分组,因为这似乎是每个订单之间的共同点。 – gffwebdev

回答

0

我可能会被误认为是这样,但是也许这样的结构会更好地满足您的需求。

SELECT oim.order_item_id AS entryId 
    , GROUP_CONCAT(DISTINCT CASE meta_key WHEN "Name" THEN meta_value ELSE NULL END) AS `Full Name` 
    , GROUP_CONCAT(DISTINCT CASE meta_key WHEN "Email" THEN meta_value ELSE NULL END) AS `User Email` 
    [, etc....] 
FROM wp_woocommerce_order_itemmeta AS oim 
GROUP BY entryId 
ORDER BY entryId 
; 

GROUP_CONCAT,最喜欢的聚集函数,忽略空值(结果为空成为只有在遇到的所有值都为空)。

至于过滤掉完全空结果;你正在寻找HAVING

+0

谢谢!我一直在寻找一种比使用子查询更有效的方式来组合数据。 – gffwebdev

+0

你也可以多次加入表格('ON t1.order_item_id = t0.order_item_id AND t1.meta_key =“Blah1”'),但这可能几乎与子查询版本一样低效。 – Uueerdo