【问题标题】:MySQL: joining 2 tables and display the last date of the child tableMySQL:加入 2 个表并显示子表的最后日期
【发布时间】:2019-04-02 01:44:16
【问题描述】:

我需要显示一个客户列表,包括他们的总购买次数和总消费金额,此外,我需要一个包含他们最后一次购买日期的列。

这是我当前的查询,但它不显示上次购买的最后可用日期:

SELECT user.id_user AS id,
purchase.date_insert AS last_purchase,
CONCAT(user.lastname, " ", user.name) AS name,
COUNT(purchase.id_purchase) AS purchases,
SUM(purchase.total) AS total
FROM user
JOIN purchase ON purchase.id_user = user.id_user
GROUP BY user.id_user
ORDER BY name

我需要获取该列的最后一个可用值,而不是只使用 purchase.date_insert AS last_purchase(检索该列的第一个可用值)。

这是结构的 sqlfiddle 和一些数据样本:http://sqlfiddle.com/#!9/d83684/1

如您在示例中看到的,last_purchase 列显示的是 2019-03-26T09:38:40Z,它应该是 2019-04-01 12:01 :24Z.

谢谢!

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    我想你一定想要max():

    SELECT u.id_user AS id,
           MAX(p.date_insert) AS last_purchase,
           CONCAT(u.lastname, ' ', user.name) AS name,
           COUNT(p.id_purchase) AS purchases,
           SUM(p.total) AS total
    FROM user u JOIN
         purchase p
         ON p.id_user = u.id_user
    GROUP BY u.id_user
    ORDER BY MAX(u.name);
    

    在大多数数据库中——包括具有默认设置的最新版本的 MySQL——您的查询将返回错误。 SELECTORDER BY 中的列不是聚合键且未聚合。

    【讨论】:

    • 那行得通,不过在你的评论结束时我有点迷失了。我应该重新构造我的键,使它们成为聚合键吗?
    • @AndresSK 。 . .这个答案解决了这个问题。注意ORDER BY 子句的区别。
    【解决方案2】:

    只使用 max()

    SELECT user.id_user AS id,
    max(purchase.date_insert) AS last_purchase,
    CONCAT(user.lastname, " ", user.name) AS name,
    COUNT(purchase.id_purchase) AS purchases,
    SUM(purchase.total) AS total
    FROM user
    JOIN purchase ON purchase.id_user = user.id_user
    GROUP BY user.id_user,user.lastname,user.name
    ORDER BY name
    

    我更喜欢在 group by thoguh 中使用 group by 非聚合列,如果不使用 group by 中的那些,mysql 不会返回错误

    【讨论】:

      猜你喜欢
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 2022-11-06
      • 2021-12-26
      • 1970-01-01
      相关资源
      最近更新 更多