mysql 按日期为每个用户选择最近的行

标签 mysql

我试图为每个唯一的用户 ID 选择最新的行,其中 pid = 50 且 active = 1。我一直无法弄清楚。

这是一个示例表

+-----+----------+-------+-----------------------+---------+
| id  | userid   | pid   | start_date            | active  |
+-----+----------+-------+-----------------------+---------+
| 1   | 4        | 50    | 2015-05-15 12:00:00   | 1       |
| 2   | 4        | 50    | 2015-05-16 12:00:00   | 1       |
| 3   | 4        | 50    | 2015-05-17 12:00:00   | 0       |
| 4   | 4        | 51    | 2015-06-29 12:00:00   | 1       |
| 5   | 4        | 51    | 2015-06-30 12:00:00   | 1       |
| 6   | 5        | 50    | 2015-07-05 12:00:00   | 1       |
| 7   | 5        | 50    | 2015-07-06 12:00:00   | 1       |
| 8   | 5        | 51    | 2015-07-08 12:00:00   | 1       |
+-----+----------+-------+-----------------------+---------+

期望的结果

+-----+----------+-------+-----------------------+---------+
| id  | userid   | pid   | start_date            | active  |
+-----+----------+-------+-----------------------+---------+
| 2   | 4        | 50    | 2015-05-16 12:00:00   | 1       |
| 7   | 5        | 50    | 2015-07-06 12:00:00   | 1       |
+-----+----------+-------+-----------------------+---------+

我已经尝试了很多东西,这是我得到的最接近的东西,但不幸的是它并没有停止。

SELECT *
FROM mytable t1
WHERE
    (
        SELECT COUNT(*)
        FROM mytable t2
        WHERE
            t1.userid = t2.userid           
            AND t1.start_date < t2.start_date
    ) < 1
AND pid = 50
AND active = 1
ORDER BY start_date DESC

最佳答案

计划

  1. get last record grouping by userid where pid is 50 and is active
  2. inner join to mytable to get the record info associated with last
<小时/>

查询

select 
my.*
from
(
select userid, pid, active, max(start_date) as lst
from mytable
where pid = 50
and   active = 1
group by userid, pid, active
) maxd
inner join mytable my
on  maxd.userid = my.userid
and maxd.pid    = my.pid
and maxd.active = my.active
and maxd.lst    = my.start_date
;

输出

+----+--------+-----+------------------------+--------+
| id | userid | pid |       start_date       | active |
+----+--------+-----+------------------------+--------+
|  2 |      4 |  50 | May, 16 2015 12:00:00  |      1 |
|  7 |      5 |  50 | July, 06 2015 12:00:00 |      1 |
+----+--------+-----+------------------------+--------+

sqlfiddle

注释

按照@Strawberry 的建议,更新为也在 pid 和 active 上加入。这将避免出现不活动或 pid 不是 50 但具有完全相同日期的记录也被渲染的可能性。

关于mysql 按日期为每个用户选择最近的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31758064/

相关文章:

mysql - 如何在 SQL 中获取数据库中 2 行之间的列差异

mysql - 如果不存在并插入 mysql 存储过程

c# - 如何将mysql表中的数据添加到C#表单中

sql - 如何连接两个数据库表并交叉引用另一个

php - 使用 PHP SESSION 变量存储 MySQL 查询结果

c# - 在Mysql数据库中插入Textbox.text "123456"作为密码

PHP - 代理脚本

mysql - 从同一张表中获取记录数时如何编写mysql innerquery

php - 如何知道该行属于哪个表?

php - 在 Phalcon 2 中找不到类用户