Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从被推荐的用户那里获取支付金额的总和_Php_Mysql - Fatal编程技术网

Php 从被推荐的用户那里获取支付金额的总和

Php 从被推荐的用户那里获取支付金额的总和,php,mysql,Php,Mysql,我正在开发一个推荐系统,作为该仪表板的一部分,我需要输出用户收到的推荐数量、他们因这些推荐购买物品而获得的硬币总数,以及最终购买物品的推荐数量和总额 例如,显示用户_ID 1的信息: 我的表格结构如下: 使用者 购买 目前我正在运行这个查询。出于某种原因,我无法理解这个问题,在本例中,它只获取与id=2匹配的第一个用户的和。countid=3,但sumamount=10.00,而不是预期的14.00。有什么想法吗 SELECT count(id) AS count, (SELECT COALE

我正在开发一个推荐系统,作为该仪表板的一部分,我需要输出用户收到的推荐数量、他们因这些推荐购买物品而获得的硬币总数,以及最终购买物品的推荐数量和总额

例如,显示用户_ID 1的信息:

我的表格结构如下:

使用者

购买

目前我正在运行这个查询。出于某种原因,我无法理解这个问题,在本例中,它只获取与id=2匹配的第一个用户的和。countid=3,但sumamount=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'

您遇到了MySQL问题,它允许聚合与非聚合在没有适当分组的情况下进行组合。其他RDBMS会抱怨您的查询,因为第一列中的计数聚合与查询其余部分返回的多行冲突

尝试删除select countid AS count中的第一列,您将看到查询为每个用户id 2、3和4返回一行

要解决此问题,请将每个子查询的所有结果相加:

SELECT count(id) AS count, 
sum((SELECT COALESCE(sum(amount), 0.00) 
    FROM purchases
    WHERE purchases.user_id = users.id 
    AND payment_status = "Completed" 
)) AS purchases_amount, 
sum((SELECT COALESCE(sum(round(amount) * 10), 0) 
    FROM purchases
    WHERE users.id = purchases.user_id 
    AND payment_status = "Completed"
)) AS coins_earned,    
sum((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'

我相信你可以试试这个

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

这似乎可以从一些SQL简化和分组中获益
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)
SELECT count(id) AS count, 
sum((SELECT COALESCE(sum(amount), 0.00) 
    FROM purchases
    WHERE purchases.user_id = users.id 
    AND payment_status = "Completed" 
)) AS purchases_amount, 
sum((SELECT COALESCE(sum(round(amount) * 10), 0) 
    FROM purchases
    WHERE users.id = purchases.user_id 
    AND payment_status = "Completed"
)) AS coins_earned,    
sum((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'
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'  
    )