在mysql中使用子查询连接两个表

时间:2016-03-13 22:11:54

标签: mysql workbench

我试图用一个子查询编写一个SELECT语句,该子查询确定客户的customer_id和last_name  其信用卡最快到期,如我的订单表中所示 并为此我想使用一个WHERE子句,但我卡住,因为结果只显示一个客户... 这是我到目前为止所拥有的。如果有人能指引我走正路......

SELECT customer_id, last_name
FROM customers
WHERE NOT EXISTS
(SELECT card_expires
FROM orders
WHERE customers.customer_id = orders.customer_id
);

2 个答案:

答案 0 :(得分:1)

虽然我不清楚您的确切过滤或订购要求,但我想您可能希望从以下开始。

SELECT customer_id, last_name, card_expires
FROM customers
  left join ( 
      SELECT card_expires
      FROM orders
  ) o on (customers.customer_id = orders.customer_id)

使用此方法,您可以看到所有客户和card_expires的完整列表,然后您就可以开始将列表过滤到您想要的内容。您可以在订单上构建子查询以选择特定的订单子集。我再一次不清楚你要做什么。但是,首先选择所有信息,您将能够看到所有信息,并能够决定过滤掉哪些信息。

您可能会决定从订单表中查看更多列,以帮助您确定要包含/排除的订单。

如果您只想查看没有card_expires条目的客户列表

 SELECT customer_id, last_name, card_expires
    FROM customers
      left join ( 
          SELECT card_expires
          FROM orders
      ) o on (customers.customer_id = orders.customer_id)
    where o.card_expires is null

如果您希望仅查看没有卡将来过期的客户。

     SELECT customer_id, last_name, card_expires
        FROM customers
          left join ( 
              SELECT card_expires
              FROM orders
              where card_expires > now()
          ) o on (customers.customer_id = orders.customer_id)
        where o.card_expires is null

在制作SQL语句时,可以更容易做到的事情是FIRST创建一个SQL语句,它返回用于过滤列表的所有列,然后应用过滤器。这样您就可以更轻松地添加和删除标准,直到您正确使用它。

我喜欢将每个标准拆分到它自己的单独行,这样我就可以用两个破折号轻松地评论行。 EX:

 SELECT customer_id, last_name, card_expires
    FROM customers
      left join ( 
          SELECT card_expires
          FROM orders
          where card_expires > now()
      ) o on (customers.customer_id = orders.customer_id)
    where 0=0
      and o.card_expires is null
      -- and last_name = 'Smith'

答案 1 :(得分:0)

使用LEFT JOIN / INNER JOIN,我假设你想要ORDER BY ASC,因为你想要最快

SELECT customer_id, last_name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.customer_id
ORDER BY card_expires ASC;