2017-04-12 26 views
0

我有三个表加入与资金三个表和统计

[网友]

id 
name 
email 

[交易]

id 
user_id 
amount 
points_rewarded 

[赎回]

id 
user_id 
points_redeemed 

我想查询数据库获取以下字段

users.id 
users.name 
transactions // Number of transactions 
redemptions // Number of redemptions 
points   // Sum of points_rewarded - sum of points_redeemed 

我能设法加入用户表,无论是交易或赎回,但我似乎无法参加全部三个在一个查询。

[用户+交易]

SELECT users.id,users.name,COUNT(transactions.id) AS transactions,SUM(transactions.points_rewarded) AS points_rewarded FROM users LEFT JOIN transactions ON users.id=transactions.user_id GROUP BY users.id, users.name 

其中给出了users.id,users.name,交易和points_rewarded正确的价值观。

[用户+赎回]

SELECT users.id,users.name,COUNT(redemptions.id) AS redemptions, IFNULL(SUM(redemptions.points_redeemed),0) AS points_redeemed FROM users LEFT JOIN redemptions ON users.id=redemptions.user_id GROUP BY users.id, users.name 

其中给出了users.id,users.name,赎回正确的价值观和points_redeemed。

如果我只是左连接都使用

SELECT users.id,users.name,COUNT(transactions.id) AS transactions,COUNT(redemptions.id) AS redemptions,SUM(transactions.points_rewarded) - IFNULL(SUM(redemptions.points_redeemed),0) AS points FROM users LEFT JOIN transactions ON users.id=transactions.user_id LEFT JOIN redemptions on users.id=redemptions.user_id GROUP BY users.id, users.name 

我得到的赎回列错误的价值观。我基本上获得了所有points_rewarded值乘以使得points(points_rewarded - points_redeemed)为负值的赎回总数,这是不可能的。

任何帮助将是伟大的!

回答

0

是的,这是因为左连接将在返回的记录的结合,这可能会改变,否则应与适用于每种设置independantly的款项(像它在使用2次独立的查询)

所以,是的,无论是查询仍然需要一个“主”的查询中共存:

SELECT users.id, 
     users.name, 
     t.transactions, 
     r.redemptions, 
     t.points_rewarded - r.points_redeemed AS points 
FROM users 
     LEFT JOIN (
     SELECT 
      users.id, 
      COUNT(*) AS transactions, 
      COALESCE(SUM(transactions.points_rewarded),0) AS points_rewarded 
     FROM users LEFT JOIN transactions ON users.id=transactions.user_id 
     GROUP BY users.id 
     ) t ON users.id = t.user_id 
     LEFT JOIN (
     SELECT 
      users.id, 
      COUNT(*) AS redemptions, 
      COALESCE(SUM(redemptions.points_redeemed),0) AS points_redeemed 
     FROM users LEFT JOIN redemptions ON users.id=redemptions.user_id 
     GROUP BY users.id 
     ) r ON users.id = r.user_id 
; 
0

基于Sebas的回答,我有去最终的查询是:

SELECT 
    users.id, 
    users.name, 
    COALESCE(t.transactions,0) AS transactions, 
    COALESCE(t.points_rewarded,0) AS points_rewarded, 
    COALESCE(r.redemptions,0) AS redemptions, 
    COALESCE(r.points_redeemed,0) AS points_redeemed, 
    COALESCE(t.points_rewarded,0)-COALESCE(r.points_redeemed,0) AS points 
    FROM users 
    LEFT JOIN (
     SELECT 
     users.id, 
     transactions.user_id, 
     COALESCE(COUNT(transactions.id),0) AS transactions, 
     COALESCE(SUM(transactions.points_rewarded),0) AS points_rewarded 
     FROM users 
     LEFT JOIN transactions ON users.id=transactions.user_id 
     GROUP BY users.id) t 
    ON users.id=t.user_id 
    LEFT JOIN (
     SELECT 
     users.id, 
     redemptions.user_id, 
     COALESCE(COUNT(redemptions.id),0) AS redemptions, 
     COALESCE(SUM(redemptions.points_redeemed),0) AS points_redeemed 
     FROM users LEFT JOIN redemptions ON users.id=redemptions.user_id 
     GROUP BY users.id) r 
    ON users.id=r.user_id 

现在剩下的就是把它转换成更“雄辩”;-)