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
)