2017-05-16 230 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