尝试通过首先将记录的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 |
+---------+
答案 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;