【问题标题】:How it is better to join a few tables (including subqueries) in one query?在一个查询中连接几个表(包括子查询)如何更好?
【发布时间】:2019-02-10 23:35:36
【问题描述】:

如何在一个查询中连接几个表(包括查询)更好?

例如,我有 2 个表:活动 (user_id, login_time) 和支付 (user_id, payment_time, amount)。两个表都有重复的 id。

任务是选择唯一的 user_id,它曾经支付过,login_time 从 05.04.12 到 10.04.12。然后按组计算总金额。

我的查询是:

SELECT t.diapason, COUNT(*) AS 'number_of_users'
FROM (SELECT CASE  
    when amount<100 then '0-100' 
    when amount>=100 then '100 +' END AS diapason
    FROM 
        (SELECT SUM(amount) AS amount 
        FROM payments GROUP BY payments.user_id) p) t
  GROUP BY t.diapason
  ORDER BY number_of_users desc;

我不知道在“2012-04-05”和“2012-04-10”之间应该在哪里使用“inner join a....”

请帮忙,谢谢!

数据样本

activity
user_id    login_time
1          05.04.2012
2          05.04.2012
3          06.04.2012
4          30.05.2012

payments
user_id    amount   payment_time
1          50       10.12.2011
1          20        09.12.2011
2          400        08.08.2011

Output for period 05.04.2012-10.04.2012

diapason     number_of_users
0-100          2
100+           1

【问题讨论】:

  • 一些示例数据和预期输出会有所帮助!
  • 这不是你今天早些时候发布的同一个问题吗???同样,没有更多信息,没有人可以帮助您。读这个。 stackoverflow.com/help/how-to-ask
  • 我已投票决定关闭此问题,因为它与您之前提出的同一问题重复。如果您想更改原始问题,请返回并编辑原始问题,而不是发布新问题。否则,你会造成很多混乱。
  • @BobRodes,我没有找到答案((

标签: mysql sql database join select


【解决方案1】:

我相信这会为您提供所需的内容(多种方式之一):

SELECT t.diapason, COUNT(*) AS 'number_of_users'
FROM (SELECT CASE  
    when amount<100 then '0-100' 
    when amount>=100 then '100 +' END AS diapason
    FROM 
        (SELECT SUM(amount) AS amount 
        FROM payments 
        INNER JOIN (SELECT DISTINCT user_id FROM activity where login_time between '2012-04-05' and '2012-04-12') AS a ON payments.user_id = a.user_id
        GROUP BY payments.user_id) AS P
      ) t
GROUP BY t.diapason
  ORDER BY number_of_users desc
;

【讨论】:

  • 可能是日期,我无法专门在 mySQL 中进行测试。可能需要将 between 条件修改为 scaisEdge 具有的内容:例如BETWEEN STR_TO_DATE('2012-05-04', '%Y-%m-%d') AND STR_TO_DATE('2012-10-04', '%Y-%m-%d')
  • 登录时间也是实际日期吗?或者是时候了? (MM.DD.YYYY 或 HH.MI.SSSS)列类型是日期/时间转换的重要细节
  • 在这种情况下,我使用简单的“介于 '2012-04-01' 和 '2012-04-100' 之间”。有用。可能是您的语法错误(在 INNER JOIN 之前)还是需要它? '
  • 完成,缺少“AS”
  • 我应该改变什么来添加下面的总结果?回答,请
猜你喜欢
  • 2013-09-23
  • 2021-11-08
  • 2018-12-02
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 2011-04-24
相关资源
最近更新 更多