从一个表连接到另一个表中选择最新结果

时间:2018-07-16 12:24:04

标签: mysql sql

我有两个桌子。

一个表包含客户数据,例如姓名和电子邮件地址。另一个表包含状态更改的日志。

状态日志表如下:

SQL server

以及客户数据:

+-------------+------------+------------+
| customer_id | status     | date       |
+-------------+------------+------------+
| 1           | Bought     | 2018-07-01 |     
| 1           | Bought     | 2018-07-02 |     
| 2           | Ongoing    | 2018-07-03 |     
| 3           | Ongoing    | 2018-07-04 |     
| 1           | Not Bought | 2018-07-05 |     
| 4           | Bought     | 2018-07-06 |     
| 4           | Not Bought | 2018-07-07 |     
| 4           | Bought     | 2018-07-08 | *    
| 3           | Cancelled  | 2018-07-09 |     
+-------------+------------+------------+

我想选择7月(07)“购买”的客户。但是,请排除状态从最近“购买”到其他任何事物的客户。

结果应该仅仅是一个客户(Philip)-其他所有客户的状态都发生了变化,而最近购买的商品除外。

我有以下SQL:

+-------------+------------+
| id | name   | email      |
+-------------+------------+
| 1  | Alex   | alex@home  |
| 2  | John   | john@home  |
| 3  | Simon  | si@home    |
| 4  | Philip | phil@home  |
+-------------+------------+

但那是我所能做到的!上面的查询仅返回一个结果,但实际上可能有多个结果。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

这是一种使用相关子查询来获取最新状态记录的方法:

SELECT sl.customerid
FROM wwym_statuslog sl
WHERE sl.date = (SELECT MAX(sl2.date)
                 FROM wwym_statuslog sl2
                 WHERE sl2.customer_id = sl.customer_id AND
                       sl2.date >= '2018-07-01' AND
                       sl2.date < '2018-08-01'
                ) AND
      sl.status = 'Bought'
ORDER BY sl.date DESC
LIMIT 1;

注意:

  • 使用有意义的表别名!也就是说,表名的缩写,而不是诸如ab之类的任意字母。
  • 使用正确的日期算术。 LIKE用于字符串。 MySQL有许多有效的日期函数。
  • 在MySQL 8+中,您将使用ROW_NUMBER()