【问题标题】:Select count and counted sum for joined table row at the same time同时选择连接表行的计数和计数和
【发布时间】:2019-11-22 10:51:52
【问题描述】:

我有 2 个表 userstransactions

我想选择计数用户交易和这些交易的总和。

我的查询看起来像

SELECT users.id,
    COUNT(transactions.amount) AS total_transactions,
    SUM(transactions.amount) AS total_amount
FROM 
    users 
LEFT JOIN transactions ON ( (transactions.user_id = users.id) AND (transactions.status=3) ) 
GROUP BY users.id 
HAVING total_transactions = X

它不能正常工作。

我的问题是如何同时使用 count 和 sum?

我该怎么办?

这是我的完整查询

这是我的完整查询:

SELECT 
    users.id, users.gender, users.phone, users.email, 
    COUNT( DISTINCT(transactions.id)) AS total_transactions, 
    SUM( transactions.amount) AS total_amount, 
    users.verification_required, user_details.optin_mail_sent, users.last_login, activities.updated_at AS last_activity 
FROM 
    users LEFT JOIN transactions ON ( (transactions.user_id = users.id) AND (transactions.status=3) ) 
LEFT JOIN 
    user_details ON (user_details.user_id = users.id) 
LEFT JOIN 
    activities ON (activities.user_id = users.id) 
WHERE (DATE(users.last_login) >= DATE_SUB( CURRENT_DATE, INTERVAL 3 MONTH)) AND (DATE(users.last_login) <= DATE_SUB( CURRENT_DATE, INTERVAL 1 MONTH)) 
    AND (users.gender='female') 
    AND (users.verification_required='1') 
    AND (users.unverified=0) 
    AND (users.active=1) 
    AND (users.gender <> '') 
GROUP BY users.id 
HAVING total_transactions = 3 
ORDER BY activities.updated_at DESC

【问题讨论】:

  • '我该怎么办?'解释你正在尝试做什么以及你所说的“它不能正常工作”是什么意思。提供样本数据和预期输出会很有用。
  • 查看更新的描述
  • 为什么有 total_transactions = 1?
  • 没有 HAVING 或者 HAVING total_transactions &gt; 1。看看这个最近的问题:stackoverflow.com/q/58990863/2527905
  • 我只想选择有 X 个交易的用户

标签: mysql sql count sum


【解决方案1】:

也许您需要汇总结果,然后将结果连接到表 users 和其余表中:

SELECT 
  u.id, u.gender, u.phone, u.email, 
  t.total_transactions, 
  t.total_amount, 
  u.verification_required, ud.optin_mail_sent, u.last_login, a.updated_at AS last_activity 
FROM users AS u 
LEFT JOIN (
  SELECT user_id, 
  COUNT(DISTINCT id) AS total_transactions,
  SUM(amount) AS total_amount
  FROM transactions
  GROUP BY user_id
  HAVING total_transactions = 3
) AS t ON (t.user_id = u.id) AND (t.status=3) 
LEFT JOIN user_details AS ud ON ud.user_id = u.id 
LEFT JOIN activities AS a ON a.user_id = u.id 
WHERE 
  (DATE(u.last_login) >= DATE_SUB(CURRENT_DATE, INTERVAL 3 MONTH)) 
  AND 
  (DATE(u.last_login) <= DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH)) 
  AND (u.gender='female') 
  AND (u.verification_required='1') 
  AND (u.unverified=0) 
  AND (u.active=1)
ORDER BY a.updated_at DESC

我为表格使用了别名来缩短代码并使其更具可读性。
我还删除了条件users.gender&lt;&gt;'',因为已经存在条件users.gender='female'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多