选择具有唯一用户ID的最新记录

时间:2014-08-20 02:42:28

标签: mysql sql distinct

我有一个数据库表,在一段时间内为每个用户包含多个条目。我正在尝试构建的查询只返回该时间段内每个用户的最新记录。

到目前为止:

SELECT *
FROM (SELECT DISTINCT * FROM picks_recorded)
WHERE date_submitted > '" . $week_start . "'
AND date_submitted < '" . $week_end . "'
ORDER BY date_submitted DESC
LIMIT 1;

我已经尝试了几个版本而没有成功。

3 个答案:

答案 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_submitteduserid的最大值,即每个用户的最新记录日期。然后我们基于useridsubmitted_date与源表内联接以获取所有必需的数据。

注意:在外部查询中使用distinct将确保如果该用户具有多个相同的最新日期记录,则仅为给定用户返回一行。但是,如果您有2条记录具有相同的useridsubmitted_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 . "'
)