通过此查询,我获得了创建它们的网站持续用户的所有通知:
SELECT id,lasts.user_id FROM notifies INNER JOIN
(SELECT user_id, MAX( created_at ) as last_at
FROM `notifies`
GROUP BY user_id
ORDER BY last_at DESC
LIMIT 5) as lasts
ON notifies.user_id = lasts.user_id
我想只让持续时间5通知这些用户。 我该如何修改此查询?
感谢
答案 0 :(得分:1)
SELECT n.*
FROM (
SELECT u.id,
COALESCE(
(
SELECT created_at
FROM notifies ni
WHERE ni.user_id = u.id
ORDER BY
user_id DESC, created_at DESC
LIMIT 5
), CAST('0001-01-01' AS DATE)) AS lt
FROM users u
) u
JOIN notifies n
ON n.user_id <= u.id
AND n.user_id >= u.id
AND n.created_at >= u.lt
在notifies (user_id, created_at)
上创建一个索引,以便快速工作。
请注意,n.user_id <= u.id AND n.user_id >= u.id
而不仅仅n.user_id = u.id
应该用于MySQL
有效使用此索引。
答案 1 :(得分:0)
select user_id,
created_at,
last_at
from (select user_id,
created_at,
last_at,
@num := if(@group = user_id, @num + 1, 1) as row_number,
@group := user_id as dummy
from `notifies`
order by last_at desc) as x
where row_number <= 5;
答案 2 :(得分:0)
读取你的sql我认为你有一个名为“通知”的表,如这些字段
id | user_id | created_at
您需要使用created_at字段获取指定用户的最后五个条目。
SELECT
id, user_id,created_at
FROM
notifies
WHERE
user_id = ?
ORDER BY
created_at DESC
LIMIT 5;
此SQL选择所有表,但过滤器只能获取user_id =? (其中?是你需要的id),然后按创建日期从最高日期(最大的时间点)开始对它进行排序,最后我们裁剪SQL只得到这个sql的前五个元素。
如果我的假设出错了,请告诉我,但这就是我认为你需要阅读你的问题。