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

时间:2019-06-26 05:28:45

标签: mysql

尝试通过首先将记录的time_sup求和,然后使用max来按时间检索最大的记录来检索记录。似乎可行。

我现在需要检查time_spent的总和是否等于用户的值(平局,如下面的示例所示,两个用户的time_spent均为10,因此应选择具有最新值的用户post),如果是的话,我只需要使用created_at列获取上次发布的user_id(较新)。我只是不知道该用什么来进行检查,它是CASE还是IF函数?如果可以的话,它将在我的查询中显示在哪里?

这是一个sql小提琴链接: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       |
+---------+

2 个答案:

答案 0 :(得分:1)

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

我使用LIMIT来解决它。降序排序(最高位在最上),然后将结果限制为1可以实现与“最大”相同的功能。

也-我不确定如果在最长时间内出现平局,您是否想选择最早或最新的记录,但这是选择最新的记录。我使用MAX选择每个用户的最后一天/时间,然后按sum_of_time排序,然后按日期排序。如果您需要相反的选择,则按顺序排序MIN(最小值)代表MAX(最大)和/或DESC(代表ASC)。问候!谢谢。

    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

答案 1 :(得分:0)

尝试使用它会给您用户ID 2

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,user_id desc
    ) AS attribute_time;