用于查找tableA中的记录的代码,这些记录在tableB中不可用

时间:2016-12-07 10:49:50

标签: mysql sql

我想如果我搜索courier_id = 950然后它将只采取那些不按顺序被拒绝的表courier_id = 950

for ex -

如果我搜索courier_id = 950,那么它只需要订单ID 852,853 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

预期输出

订单表

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

4 个答案:

答案 0 :(得分:1)

使用左连接,您必须将条件传递到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

<强> [UPDATE]

在我阅读评论后,我认为正确的查询是使用子查询:

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 :(得分: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

答案 2 :(得分: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

在前一代码中,首先连接行,然后删除带有'id!= 950'的行。在后一个代码中,加入时会删除带有“id!= 950”的行。

答案 3 :(得分:-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 )