我正在研究推荐系统,作为该仪表板的一部分,我需要输出用户已收到的推荐数量,这些推荐购买物品后他们所获得的硬币总数,最后推荐购买物品的数量和总金额。
例如,显示User_ID
1的信息:
Referrals: 3
Total no. of purchases from all referrals: 2
Sum of purchase amount: $14.00
Coins earned as a result of those purchases: 140 (14 * 10)
我的表格结构如下:
用户
|-------------------------------------------------|
| id | ... some other columns ... | referred_by |
|-------------------------------------------------|
| 1 | .............. | 0 |
| 2 | .............. | 1 |
| 3 | .............. | 1 |
| 4 | .............. | 1 |
---------------------------------------------------
购买
|---------------------------------------------------------|
| purchase_id | user_id | payment_status | amount |
|---------------------------------------------------------|
| 1 | 2 | Completed | 10.00 |
| 2 | 3 | Completed | 4.00 |
| 3 | 1 | Completed | 9.00 |
-----------------------------------------------------------
目前我正在运行此查询。由于某种原因,我无法理解问题,它只抓取它匹配的第一个用户的总和(在本例中为id = 2
)。 count(id) = 3
但sum(amount) = 10.00
而不是预期的14.00
。有什么想法吗?
SELECT count(id) AS count,
(SELECT COALESCE(sum(amount), 0.00)
FROM purchases
WHERE purchases.user_id = users.id
AND payment_status = "Completed"
) AS purchases_amount,
(SELECT COALESCE(sum(round(amount) * 10), 0)
FROM purchases
WHERE users.id = purchases.user_id
AND payment_status = "Completed"
) AS coins_earned,
(SELECT count(purchase_id)
FROM purchases
WHERE users.id = purchases.user_id
AND payment_status = "Completed"
) AS purchases_count
FROM (`users`)
WHERE `referred_by` = '1'
AND `created` >= '2015-01-01 00:00:00' // created = user's registration date
AND `created` <= '2015-12-31 23:59:59'
返回数据集:
count: 3 (expected: 3)
purchases_amount: 10.00 (expected: 14.00)
coins_earned: 100 (expected: 140)
purchases_count: 1 (expected: 2)
答案 0 :(得分:2)
你遇到了MySQL问题,它默默地允许聚合与非聚合组合而没有适当的分组。其他RDBMS会抱怨您的查询,因为第一列中的AAA : 12:00:00
ABC : 12:00:01
ABB : 12:00:02
ABM : 12:00:11
聚合与查询其余部分返回的多行冲突。
尝试删除select(COUNT()
)中的第一列,您将看到查询为每个用户ID(2,3和4)返回一行。
要解决此问题,请汇总每个子查询的所有结果:
count(id) AS count
答案 1 :(得分:-1)
我相信你可以试试这个
SELECT
COALESCE(SUM(amount), 0.00) AS purchases_amount,
COALESCE(SUM(ROUND(amount) * 10), 0) AS coins_earned,
COUNT(purchase_id) AS purchases_count
FROM purchases
WHERE
payment_status = "Completed"
AND user_id IN (
SELECT id FROM users
WHERE `referred_by` = '1'
AND `created` >= '2015-01-01 00:00:00'
AND `created` <= '2015-12-31 23:59:59'
)