0

我试图弄清楚如何编写 SQL 查询中涉及 3 个表。

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

后元*

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

查询应执行以下操作:

  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_id)

  4. 这些结果,参考 itemmeta.order_item_id 并找到 itemmeta.meta_key = '_product_id'
    -> return itemmeta.meta_value

最后结果:

order_items.order_id, order_itemmeta.meta_value (_product_id)

所以在上面的表格中,这将返回 1 行:

  order_id => 201
  meta_value => 100

我不太确定执行此查询所需的合并和否定。将不胜感激有人可以提供的任何帮助!

4

2 回答 2

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

虽然现在是清晨,但我显然还没有彻底测试过它,所以不能保证;)

于 2013-11-10T06:06:49.510 回答
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演示

于 2013-11-10T06:17:23.190 回答