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

Joining two tables using subquery in mysql

我正在尝试编写一个带有子查询的 SELECT 语句,该子查询确定客户的 customer_id 和 last_name 如我的订单所示,谁的信用卡最快过期 table 为此我想使用 WHERE 子句但我卡住了,因为结果只显示一个客户...... 这是我到目前为止所拥有的。如果有人能引导我走上正确的道路..

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

使用 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;

虽然我不清楚您的确切过滤或排序要求,但我认为您可能希望从以下内容开始。

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,然后您可以开始根据需要筛选列表。您可以针对 select 特定订单子集构建订单子查询。同样,我不清楚你到底想做什么。但是通过先 select 查看所有信息,您将能够看到所有信息并能够决定要过滤掉的内容。

您可以决定还希望查看订单 table 中的更多列,以帮助您决定要包含/排除哪些订单。

如果您只想查看没有 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 语句时,可以更容易做到的是首先创建一个 SQL 语句,其中 returns 您将用于过滤列表的所有列通过,然后应用过滤器。这将使您可以更轻松地添加和删除标准,直到您正确为止。

我喜欢将每个条件拆分到单独的行中,这样我就可以轻松地用两个破折号来注释行。例如:

 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'