2013-10-11 20 views
0

我有以下SQL:SQL選擇的ID,是不是在另一個表,除非該寄存器具有一定的列數據

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(外鍵)上也匹配。 但是現在,系統更新改變了一些事情:現在我想在註釋區域獲得相同的結果,PLUS:如果payment_method寄存器有'status = 0'列,我也必須得到該id,如果命令.id在payment_method.order_id(外鍵)上。

我吮吸SQL,任何人都可以幫助我嗎? 謝謝!

回答

1

通常情況下,NOT IN(子查詢的查詢)上表現不佳。相反,做一個LEFT-JOIN會更好,如果另一個表是NULL(表示不存在),則接受該記錄。如果您想包含其他特殊情況,這也有助於您的狀況。例如:

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) 
+0

似乎你明白了。 「pm.order_id IS NULL」是我想要的。非常感謝你! – caematos

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 
+0

對不起,我編輯了我的問題。 IN功能有很多付款方式。我需要得到不在payment_method表上的結果PLUS結果,如果在該表中,必須有狀態= 0。 – caematos

相關問題