我有一个数据库表,在一段时间内为每个用户包含多个条目。我正在尝试构建的查询只返回该时间段内每个用户的最新记录。
到目前为止:
SELECT *
FROM (SELECT DISTINCT * FROM picks_recorded)
WHERE date_submitted > '" . $week_start . "'
AND date_submitted < '" . $week_end . "'
ORDER BY date_submitted DESC
LIMIT 1;
我已经尝试了几个版本而没有成功。
答案 0 :(得分:2)
试试这个:
select distinct p.* from
picks_recorded p
inner join
(select userid, max(date_submitted) as maxdate from picks_recorded
WHERE date_submitted > '" . $week_start . "'
AND date_submitted < '" . $week_end . "'
group by userid) s on p.userid = s.userid and p.date_submitted = s.maxdate
基本上,我们使用group by来获取date_submitted
每userid
的最大值,即每个用户的最新记录日期。然后我们基于userid
和submitted_date
与源表内联接以获取所有必需的数据。
注意:在外部查询中使用distinct
将确保如果该用户具有多个相同的最新日期记录,则仅为给定用户返回一行。但是,如果您有2条记录具有相同的userid
和submitted_date
,但即使是一个不同的字段,也会返回两个记录。在这种情况下,您需要提供额外的逻辑来说明最终结果中应该保留2条记录中的哪一条。
另外,您应该避免通过与变量连接来构建查询。相反,您应该使用预准备语句/参数化查询。
答案 1 :(得分:0)
尝试将DISTINCT *
更改为此DISTINCT(userid)
例如:
SELECT * FROM (SELECT DISTINCT(userid) FROM picks_recorded)
WHERE
date_submitted > '" . $week_start . "'
AND
date_submitted < '" . $week_end . "'
ORDER BY date_submitted DESC
LIMIT 1;
答案 2 :(得分:0)
您可以使用not exists
在特定时间段内按用户获取最新行。即,在该用户的最近一行不存在的时间段内仅选择那些行
SELECT *
FROM picks_recorded p1
WHERE date_submitted > '" . $week_start . "'
AND date_submitted < '" . $week_end . "'
AND NOT EXISTS (
SELECT 1 FROM picks_recorded p2
WHERE p2.user_id = p1.user_id
AND p2.date_submitted > p1.date_submitted
AND p2.date_submitted < '" . $week_end . "'
)