mysql - 使用最大时间和时间总和检索记录,如果不同用户有相同时间,则获取具有最新创建日期的记录

标签 mysql

<分区>

尝试通过首先将它们的 time_spent 求和来检索记录,然后使用 max 按时间检索最大的记录。这似乎有效。

我现在需要检查用户的 time_spent 总和是否有相同的值(平局,如下例所示,两个用户的 time_spent 都为 10,因此它应该选择具有最新的用户发布),如果是,那么我只需要使用 created_at 列获取最后(更新)发布的 user_id。我只是不知道用什么来做那个检查,是 CASE 还是 IF 函数?如果是这样,它会在我的查询中去哪里?

这是一个 sql fiddle 链接:http://sqlfiddle.com/#!9/f24985/2

表1布局

+----+---------+-----------+---------+------------+------------+
| id | user_id | member_id | item_id | time_spent | created_at |
+----+---------+-----------+---------+------------+------------+
| 1  | 1       | 1         | 1       | 5          | 2019-06-01 |
| 2  | 2       | 1         | 1       | 1          | 2019-06-07 |
| 3  | 2       | 1         | 1       | 5          | 2019-06-08 |
| 4  | 2       | 1         | 2       | 4          | 2019-06-01 |
| 5  | 1       | 1         | 2       | 5          | 2019-06-07 |
+----+---------+-----------+---------+------------+------------+

当前 SQL:

SELECT 
    MAX(attribute_time.sum_time), attribute_time.user_id
    FROM (
        SELECT 
            SUM(time_spent) AS sum_time, user_id
        FROM 
            table1
        WHERE 
            member_id = 1
            AND item_id IN (1, 2)
            AND (created_at BETWEEN '2019-06-1' AND '2019-06-30')
        GROUP BY 
            user_id
        ORDER BY 
            sum_time desc
    ) AS attribute_time;

在这个例子中,两个用户总共有 10 个时间,当前返回 2 的第一条记录,而不是基于 created_at 日期,在这种情况下,应该是用户 2。

预期

+---------+
| user_id |
+---------+
| 2       |
+---------+

最佳答案

这就是您要找的。 http://sqlfiddle.com/#!9/a5306c/4/0 MAX 子句对于涉及数量的子查询是有问题的,除非您使用一些重复和冗长的查询(DRY!),如此处的答案所示:MySQL: Select MAX() from sub-query with COUNT() - 它似乎解耦了行,所以你得到了错误 id 的最高(最大)sum_time(我以为我看到了东西,看起来很简单)

我使用 LIMIT 来绕过它。降序排序(最高的在顶部),然后将结果限制为 1 实现与“最大”相同的结果。

此外 - 我不确定如果最大时间出现平局,您是否想选择最早或最晚的记录,但这会选择最新的。我使用 MAX 为每个用户选择最后一天/时间,然后按 sum_of_time 排序,然后按日期排序。如果你想要相反的,在排序依据中为 MAX 和/或 DESC 为 ASC 子 MIN。问候!感谢练习。

    SELECT 
        SUM(time_spent) AS sum_time, user_id, MAX(created_at)
    FROM 
        Table1
    WHERE 
        member_id = 1
        AND item_id IN (1, 2)
        AND (created_at BETWEEN '2019-06-1' AND '2019-06-30')
    GROUP BY 
        user_id
    ORDER BY
         sum_time DESC, created_at DESC
    LIMIT 1

关于mysql - 使用最大时间和时间总和检索记录,如果不同用户有相同时间,则获取具有最新创建日期的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56765800/

相关文章:

android - mysql 获取的数据不显示在 android 的 ListView 上

PHP 在 Web 服务器上显示为纯文本?

mysql - mysql查询中字母 't'是什么意思

php - 我想使用 PHP 的 PDO 将数据插入到 mysql 数据库中。但是没有插入数据

mysql - 如何获得mysql请求的答案并入库?

php - 如何使用 Yii 查询构建器创建复杂查询

mysql - 如何使用 Nodejs 和 MySQL 动态自动填充输入字段?

mysql - 使用特殊字符对数据进行排序

php - 连接到相同的数据库 WordPress 表被添加到

php - 从 MySQL 到 XML 再到 HTML 的编码问题