在 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'
我正在尝试编写一个带有子查询的 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'