mysql - 从一个表连接到另一个表中选择最近的结果

标签 mysql sql

我有两张 table 。

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

状态日志表如下所示:

+-------------+------------+------------+
| 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 |     
+-------------+------------+------------+

和客户数据:

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

我想选择在 7 月 (07) 有“购买”的客户。但排除最近状态从“购买”其他任何东西变为“购买”的客户。

结果应该只有一个客户 (Philip) - 所有其他客户的状态都已更改为最近已购买以外的状态。

我有以下 SQL:

SELECT 
    a.customer_id
FROM
    statuslog a
WHERE
    DATE(a.`date`) LIKE '2018-07-%'
        AND a.status = 'Bought'
        ORDER BY a.date DESC
        LIMIT 1

但这就是我所能得到的!上面的查询只返回一个结果,但实际上可能有多个结果。

感谢任何帮助!

最佳答案

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

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()

关于mysql - 从一个表连接到另一个表中选择最近的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51361776/

相关文章:

MySQL:计算已知(或枚举)不同值的出现次数

MySql Case语句获取日期时间在现在之后的第一行

sql - Oracle - 分组依据为 "steps"

mysql - 将所有大于 0 的选定值设置为 1 : mySQL

php - MySQL数据库设计——关系表

mysql过程检查条目是否存在

PHP 发布 <a href> 导致插入错误

sql - 允许登录运行存储过程而无法从表中选择

根据最近 7 天内的日期查询前 3 名售罄产品的 SQL 查询

mysql - sql从when id中选择多个值