【问题标题】:Mysql select oldest record for each userMysql为每个用户选择最旧的记录
【发布时间】:2012-06-04 04:44:00
【问题描述】:

我正在尝试在 PHP 中为数据库中的每个用户创建一个最旧条目的列表。

SELECT *, 
MIN(`entries`.`entry_date`) 
AS entry_date 
FROM (`entries`) 
JOIN `user_profiles` 
ON `user_profiles`.`user_id` = `entries`.`user_id` 
WHERE `status` = 1 
GROUP BY `entries`.`user_id`

我正在使用查询从entries 表中检索使用MIN() 的最旧日期条目,并与表user_profiles 连接以获取其他数据。查询应该为每个用户选择最旧的条目。它似乎有效,但是当我回显某些条目时,它会在某些条目上检索错误的 entry_date 字段。请帮忙,我看不出我做错了什么..

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    您需要使用子查询来获取每个用户的(user_id, entry_date) 对,然后将其与选择感兴趣记录的查询相结合:

    SELECT *
    FROM   entries
      NATURAL JOIN (
        SELECT   user_id, MIN(entry_date) AS entry_date
        FROM     entries
        GROUP BY user_id
      ) AS tmin
      JOIN user_profiles USING (user_id)
    WHERE  status = 1
    

    【讨论】:

    • 谢谢!我尝试了查询并得到了Duplicate column name 'entry_date',然后我更改了AS another_name,但得到了相同的结果,但最旧的条目不正确
    • @Cyber​​Junkie:user_profiles 表是否还包含名为entry_date 的列?我还注意到我的原始答案中有一个错字(现已更正):我引用了一个名为 events 而不是 entries 的表 - 你已经发现了吗?
    • 否,但它包含我需要的其他列。查询成功地使用MIN() 为每个用户检索了最旧的entry_date,但是当我在 php 中回显时,其他行与它不对应
    • @Cyber​​Junkie:如果抛出 Duplicate column 错误,查询如何“成功检索”任何内容?困惑。
    • 对不起,我通过重命名 MIN(entires.entry_date) 修复了重复错误,但得到了初始结果。正确的最早条目日期,但每个条目都错误
    【解决方案2】:

    您是否尝试过从 user_profiles 表而不是 entries 表来解决问题?如果用户没有条目,他们将不会出现在上述查询中。

    这可能会有所帮助,但我不确定这是否是完整的解决方案:

    SELECT *, MIN(entries.entry_date) as entry_date
    FROM user_profiles LEFT JOIN entries USING (user_id)
    WHERE status = 1
    GROUP BY user_profiles.user_id
    

    另外,您将 MIN(entires.entry_date) 重命名为 entry_date...但是您已经有一个名为 entry_date 的列。尝试将派生列重命名为“min_entry_date”之类的独特名称?

    【讨论】:

    • 谢谢!我尝试了您的查询,但得到相同的结果.. 可能是 php 问题
    猜你喜欢
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多