2016-12-07 47 views
2

我想,如果我搜索courier_id = 950那麼它將只需要那些不反對courier_id = 950代碼以找到TABLEA其不可TableB中

爲了拒絕表前訂單記錄 -

如果我搜索courier_id = 950將只需要順序編號852853 bcoz這不是爲了反對拒絕表courier_id = 950

請參見下面的例子

EX: -

訂單表

id, ordername 
850 test1 
851 test2 
852 test3 
853 test4 

爲了拒絕表

id,courier_id,order_id 
1 950  850 
2 950  851 
3 951  853 

預期輸出

Orders表

id, ordername 
852 test3 
853 test4 

下面是我的查詢

SELECT o.id 
FROM orders o 
LEFT JOIN order_rejected_details r ON o.id = r.order_id 
WHERE r.courier_id != 950 
+0

SELECT o。* FROM orders o LEFT JOIN rejected r ON o.id = r.id WHERE r.id IS NULL應該完成這項工作。 – mirko911

+0

您是否嘗試過'r.id IS NULL'條件? –

+0

我想如果我搜索courier_id = 950那麼它將採取只有那些順序不順序courier_id = 950 爲前 - 如果我搜索courier_id = 950它將只需要訂單id 852,853 bcoz這是不要按順序拒絕courier_id = 950 –

回答

1

使用LEFT JOIN必須通過的條件爲WHERE子句ON條款

SELECT o.id 
FROM orders o 
    LEFT JOIN order_rejected_details r 
    ON o.id = r.order_id AND r.courier_id != 950 

[更新]

我讀了評論之後,我認爲,正確的查詢使用子查詢:

SELECT o.id 
FROM orders o 
WHERE 
    o.id NOT IN (
     SELECT r.order_id 
     FROM order_rejected_details r 
     WHERE r.courier_id = 950 
    ) 
+1

您已經使用了一個左連接並且沒有包含where語句。您將檢索訂單表中的每個ID。 –

+0

我已經改變了答案,使用子查詢搜索所有訂單的ID不會被拒絕與courier_id = 950. – rogeriolino

0

使用LEFT JOIN和的NULL過濾器。

SELECT o.id, o.ordername 
FROM orders o 
LEFT JOIN order_rejected_details r ON r.order_id = o.id AND r.courier_id = 950 
WHERE r.id IS NULL 
0

該條件消除了具有空值的行。因此必須添加額外的約束。 要麼,

SELECT o.id, o.order_name FROM orders o LEFT JOIN orders_rejected r ON o.id = r. order_id 
WHERE r.courier_id != 950 OR r.courier_id IS NULL 

,或者

SELECT o.id, o.order_name FROM orders o LEFT JOIN orders_rejected r ON o.id = r. order_id 
AND r.courier_id = 950 WHERE r.courier_id IS NULL 

在前者的代碼,行被加入了與第一,然後行 '身份證!= 950' 被消除。而在後面的代碼中,加入時'id!= 950'的行被刪除。

-1

您可以使用此查詢爲您的目的。

SELECT * FROM `order` WHERE `order_id` NOT IN (SELECT GROUP_CONCAT(DISTINCT(r.order_id)) FROM order_reject r GROUP BY r.order_id) 
+0

你沒有使用他的過濾器(950)和GROUP_CONCAT將返回一個逗號分隔的字符串?我不明白這是如何工作的。 –

相關問題