0

我有以下 SQL:

SELECT id FROM order o 
INNER JOIN order_payment p ON p.parent_id=o.entity_id 
WHERE o.state='new' 
AND o.created_at BETWEEN '2013-05-14' 
AND '2013-10-11 00:19:09' 
AND p.method IN ('paymethod_a', 'paymethod_b', 'paymethod_c') 
--AND o.id NOT IN (SELECT id FROM order o 
--INNER JOIN payment_method pm ON pm.order_id=o.id 
--WHERE o.created_at BETWEEN '2013-05-14' AND '2013-10-11 00:19:09')**

在评论部分,我也不想获得与表 payment_method.order_id (外键)匹配的任何 id。但是现在,系统更新改变了一些事情:现在我想在评论区得到相同的结果,另外:如果一个 payment_method 寄存器有一个 'status=0' 列,我也必须得到那个 id,不管订单。 id 在 payment_method.order_id (外键)上。

我的 SQL 很烂,谁能帮帮我?谢谢!

4

2 回答 2

1

通常,NOT IN(子选择查询)的性能很差。相反,如果另一个表为 NULL(表示不存在),则执行 LEFT-JOIN 并接受记录要好得多。如果您想要包括的其他特殊情况可能存在,这也有助于您的情况。就像是:

SELECT 
      o.id 
   FROM 
      order o 
         JOIN order_payment op 
            ON o.entity_id = op.parent_id
           AND op.method in ('paymethod_a', 'paymethod_b', 'paymethod_c') 
         LEFT JOIN payment_method pm
            on o.id = pm.order_id
   where
          o.state='new' 
      AND o.created_at BETWEEN '2013-05-14' AND '2013-10-11 00:19:09' 
      AND ( pm.order_id IS NULL
           OR pm.status = 0 )
于 2013-10-11T16:22:42.953 回答
0

考虑到您要加入 3 个不同的表并包含状态 0

SELECT id FROM order o 
INNER JOIN order_payment p ON p.parent_id=o.entity_id 
INNER JOIN payment_method t3 ON t3.order_ID = o.orderID
WHERE o.state='new' 
AND o.created_at BETWEEN '2013-05-14' 
AND '2013-10-11 00:19:09' 
--query modified,if there are only one parameters,Function 'IN' is not supported
AND p.method = 'payment_method'

--you never exclude status = 0 in payment_method table, so nothing is needed to do at all
于 2013-10-11T02:07:23.150 回答