从推荐用户那里获取付款金额

时间:2015-08-12 06:05:11

标签: php mysql

我正在研究推荐系统,作为该仪表板的一部分,我需要输出用户已收到的推荐数量,这些推荐购买物品后他们所获得的硬币总数,最后推荐购买物品的数量和总金额。

例如,显示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) = 3sum(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)

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'  
    )