2013-11-10 39 views
0

我有3個表涉及SQL查詢我想弄清楚如何編寫。爲匹配和非匹配創建SQL查詢

itemmeta

order_item_id  meta_key   meta_value 
------------------- ------------------ ------------------- 
1     _subscription_test 0 
1     _subscription_more 0 
1     _product_id   100 
2     _subscription_test 0 
2     _subscription_more 0 
2     _product_id   100 
3     _product_id   100 

ORDER_ITEMS

order_item_id  order_id 
------------------- ------------------ 
1     200 
2     201 
3     202 

postmeta *

order_id   meta_key 
------------------ ------------------ 
200     _original_order 

查詢應d Ø如下:

  1. 查找itemmeta.order_item_id

    Where itemmeta.meta_key LIKE '_subscription%' 
        OR itemmeta.meta_key LIKE '_recurring%' 
    

    - >使用唯一的值從這裏

  2. 採取這些itemmeta.order_item_id值和匹配,以order_items.order_item_id
    - > return order_items.order_id

  3. 把那些order_items.order_id和比賽進行到postmeta.post_id其中postmeta.meta_key沒有爲「_original_order」
    匹配(扔出去,其中的元鍵存在任何order_ids)

  4. 那些那些結果,參考回到itemmeta.order_item_id並找到那些其中itemmeta.meta_key = '_product_id'
    - >返回itemmeta.meta_value

最終結果:

order_items.order_id, order_itemmeta.meta_value (_product_id) 
所以上面的表格中

將返回1行:

order_id => 201 
    meta_value => 100 

我不是執行該查詢所需的合併和底片十分肯定。希望有人能夠提供任何幫助!

+0

您是否嘗試寫這樣的查詢? –

+0

您正在使用哪些DBMS?甲骨文? Postgres的? –

回答

1

也許這樣的事情會工作?

SELECT order_id, meta_value FROM 
(
    SELECT oi.order_id, oi.order_item_id FROM order_items oi 
    LEFT JOIN postmeta pm ON oi.order_id = pm.order_id 
    WHERE oi.order_item_id IN (SELECT im.order_item_id FROM itemmeta im WHERE im.meta_key LIKE '_subscription%' OR im.meta_key LIKE '_recurring%') 
    AND oi.order_id NOT IN (SELECT pm.order_id FROM postmeta pm WHERE pm.meta_key = '_original_order') 
) subquery 
INNER JOIN itemmeta im ON subquery.order_item_id = im.order_item_id 
WHERE im.meta_key = '_product_id' 

當這個SQL Fiddle測試它給出了這樣的結果:

ORDER_ID META_VALUE 
201   100 

這是在我雖然一早,我顯然還沒有測試它是徹底讓沒有保證;)

+1

添加SELECT DISTINCT後,我接受此:) – ChuckMac

1

一種可能的解決

SELECT i.order_id, m.meta_value 
    FROM 
(
    SELECT order_item_id, 
     MAX(CASE WHEN meta_key = '_product_id' THEN meta_value END) meta_value 
    FROM itemmeta 
    WHERE meta_key LIKE '_subscription%' 
     OR meta_key LIKE '_recurring%' 
     OR meta_key = '_product_id' 
    GROUP BY order_item_id 
    HAVING MAX(meta_key LIKE '_subscription%') 
     + MAX(meta_key LIKE '_recurring%') > 0 
) m JOIN order_items i 
    ON m.order_item_id = i.order_item_id LEFT JOIN postmeta p 
    ON i.order_id = p.order_id 
    AND p.meta_key = '_original_order' 
WHERE p.order_id IS NULL 

輸出:

 
| ORDER_ID | META_VALUE | 
|----------|------------| 
|  201 |  100 | 

這裏是SQLFiddle演示

+0

這不太合適。它可以找到任何3個鍵存在的所有值('_subscription','_recurring%'或'_product_id')。只有當前2的值存在時它才匹配。 我更新了小提琴演示 - [SQLFiddle](http://sqlfiddle.com/#!2/ae4792/1) - 最後一行不應該返回。 – ChuckMac

+0

@ChuckMac固定。 – peterm

+0

更新版本的作品,謝謝! – ChuckMac