MySQL 查询未被客户选择的日期
MySQL Query for dates that have not been picked by a customer
我正在使用 mySQL 构建一个应用程序,客户可以在其中选择可用日期。
我想要两个查询,一个指定每个客户选择的时段,一个指定尚未选择的日期。
设置
我有一个日期形式的时间段列表
TABLE: timeslots
slot_id | date
1 | 2020-10-01
2 | 2020-10-02
3 | 2020-10-03
我也有一个客户table
TABLE: customers
customer_id | name
1 | Anders
2 | Joe
3 | Karen
每个客户都可以选择 customer_timeslot table 中指定的任何日期,其中有两个外键。
TABLE: customer_timeslot
customer_id | slot_id
1 | 1
1 | 2
2 | 1
3 | 1
先查询都好
第一个查询很简单,它给了我安德斯选择的日期。
查询安德斯(客户 1)选择的日期
SELECT timeslots.date AS Date, customer.name AS Customer FROM timeslots
JOIN customer_timeslot
USING (slot_id)
JOIN customers
USING (customer_id)
WHERE customers.customer_id = 1
结果查询1
Date | Customer
2020-10-01 | Anders
2020-10-02 | Anders
第二次查询我想要的结果
我想要安德斯尚未选择的日期,看起来像这样
Date | Customer
2020-10-03 | Anders
我试过的
我尝试使用 LEFT JOIN 而不是 JOIN..
SELECT timeslots.date AS Date, customer.name AS Customer FROM timeslots
LEFT JOIN customer_timeslot
USING (slot_id)
JOIN customers
USING (customer_id)
WHERE customers.customer_id = 1
..我预计会给我这个结果,但却给我与 INNER JOIN 完全相同的结果(没有 NULL 可以使用)
Date | Customer
2020-10-01 | Anders
2020-10-02 | Anders
2020-10-03 | NULL
我怎样才能得到想要的查询?我想不应该这么复杂,但我发现自己完全陷入困境并寻求帮助。
你可以使用 not exists
:
select t.*
from timeslots t
where not exists (
select 1
from customer_timeslot ct
where ct.customer_id = 1 and ct.slot_id = t.slot_id
)
这个returns customer_id
1
没有选择的时隙。您可以通过 cross join
立即获取所有客户的信息,然后 not exists
:
select t.date, c.name
from timeslots t
cross join customers c
where not exists (
select 1
from customer_timeslot ct
where ct.customer_id = c.customer_id and ct.slot_id = t.slot_id
)
我正在使用 mySQL 构建一个应用程序,客户可以在其中选择可用日期。
我想要两个查询,一个指定每个客户选择的时段,一个指定尚未选择的日期。
设置
我有一个日期形式的时间段列表
TABLE: timeslots
slot_id | date
1 | 2020-10-01
2 | 2020-10-02
3 | 2020-10-03
我也有一个客户table
TABLE: customers
customer_id | name
1 | Anders
2 | Joe
3 | Karen
每个客户都可以选择 customer_timeslot table 中指定的任何日期,其中有两个外键。
TABLE: customer_timeslot
customer_id | slot_id
1 | 1
1 | 2
2 | 1
3 | 1
先查询都好
第一个查询很简单,它给了我安德斯选择的日期。
查询安德斯(客户 1)选择的日期
SELECT timeslots.date AS Date, customer.name AS Customer FROM timeslots
JOIN customer_timeslot
USING (slot_id)
JOIN customers
USING (customer_id)
WHERE customers.customer_id = 1
结果查询1
Date | Customer
2020-10-01 | Anders
2020-10-02 | Anders
第二次查询我想要的结果
我想要安德斯尚未选择的日期,看起来像这样
Date | Customer
2020-10-03 | Anders
我试过的
我尝试使用 LEFT JOIN 而不是 JOIN..
SELECT timeslots.date AS Date, customer.name AS Customer FROM timeslots
LEFT JOIN customer_timeslot
USING (slot_id)
JOIN customers
USING (customer_id)
WHERE customers.customer_id = 1
..我预计会给我这个结果,但却给我与 INNER JOIN 完全相同的结果(没有 NULL 可以使用)
Date | Customer
2020-10-01 | Anders
2020-10-02 | Anders
2020-10-03 | NULL
我怎样才能得到想要的查询?我想不应该这么复杂,但我发现自己完全陷入困境并寻求帮助。
你可以使用 not exists
:
select t.*
from timeslots t
where not exists (
select 1
from customer_timeslot ct
where ct.customer_id = 1 and ct.slot_id = t.slot_id
)
这个returns customer_id
1
没有选择的时隙。您可以通过 cross join
立即获取所有客户的信息,然后 not exists
:
select t.date, c.name
from timeslots t
cross join customers c
where not exists (
select 1
from customer_timeslot ct
where ct.customer_id = c.customer_id and ct.slot_id = t.slot_id
)