三方SQL连接的麻烦

时间:2018-04-03 14:24:03

标签: mysql join

我是SQL连接的新手,并没有找到完成我需要的正确方法。我正在尝试编写一个每天运行一次的作业来收集id表中的emailcustomers值,但仅适用于昨天发生的约会

注意:我正在使用专有系统,无权更改数据库中数据的组织方式。为了清楚起见,我已从此帖中排除了非重要字段。

在mySQL中假设以下三个表结构和数据:

表:客户

id | email
   1 | user@domain.com
   2 | user2@domain.com
   ...

表:customer_appointments

customer_id | appointment_id
   1 | 200
   2 | 201
   1 | 202
   2 | 203
   ...

表:约会

id | start_date
   200 | 2018-04-02 00:09:00
   201 | 2018-04-02 00:10:00
   202 | 2018-04-03 00:09:00
   203 | 2018-04-03 00:01:00
   ...

我认为我需要做的是:

  • 使用以下选项appointments.id选择昨天发生的所有appointments

    SELECT id FROM appointments其中DATE(start_date)= DATE(NOW() - INTERVAL 1 DAY);

  • 使用appointments.id

  • 加入customer_appointments.customer_id
  • 使用customer_appointments.customer_id

  • 加入customers.id

我已经做了几次尝试,但是我对连接的不了解确实在阻碍。 :)

您可以提供任何提示,我们将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

你需要注意的一些事情1)select中的id是不明确的,你需要用表名(或别名)来限定它2)wp_ab_customers.id.id - 可能是一个错字但是.id应该只是出现一次3)日期测试在=运算符后没有正确括号4)你需要反转你的联接顺序 - 在这种情况下mysql需要自上而下阅读,即wp_ab_customers>> wp_ab_customer_appointments>> wp_ab_appointments 5)使用表别名会使这更容易阅读。

所以这是最后整理的代码

SELECT wp_ab_customers.id,email ,wp_ab_appointments.start_date
FROM wp_ab_customers 
INNER JOIN wp_ab_customer_appointments ON wp_ab_customer_appointments.customer_id = wp_ab_customers.id 
INNER JOIN wp_ab_appointments ON wp_ab_customer_appointments.appointment_id = wp_ab_appointments.id 
where DATE(wp_ab_appointments.start_date) = (date(now()) - interval 1 day);

+------+------------------+---------------------+
| id   | email            | start_date          |
+------+------------------+---------------------+
|    1 | user@domain.com  | 2018-04-02 00:09:00 |
|    2 | user2@domain.com | 2018-04-02 00:10:00 |
+------+------------------+---------------------+
2 rows in set (0.02 sec)

使用表别名

SELECT c.id,email ,a.start_date
FROM wp_ab_customers as c
INNER JOIN wp_ab_customer_appointments as ca ON ca.customer_id = c.id 
INNER JOIN wp_ab_appointments as a ON ca.appointment_id = a.id 
where DATE(a.start_date) = (date(now()) - interval 1 day);

+------+------------------+---------------------+
| id   | email            | start_date          |
+------+------------------+---------------------+
|    1 | user@domain.com  | 2018-04-02 00:09:00 |
|    2 | user2@domain.com | 2018-04-02 00:10:00 |
+------+------------------+---------------------+
2 rows in set (0.00 sec)

答案 1 :(得分:1)

通过这个,您将获得客户ID,约会ID和电子邮件:

SELECT a.id ,b.appointment_id,c.email
FROM appointments a
    join customer_appointmens b on a.id=b.appointment_id
    join customers c on c.id=b.customer_id
where DATE(a.start_date) = DATE(NOW() - INTERVAL 1 DAY);