即使表2中没有行,如何连接表并显示

时间:2011-07-25 16:43:58

标签: mysql database join

我有2个表,1个用户,另一个用于交易。我试图用他们的交易总和显示所有用户。

以下声明正确显示,但它只包含有交易的用户。如何列出所有用户,如果没有交易,则应将总和显示为0?

以下是我正在使用的声明:

SELECT 
    user.ID, user.FirstName, user.LastName, 
    user.Username, 
    SUM(transaction.Amount) As Total
FROM    user 
    LEFT JOIN transaction 
        ON user.ID = transaction.runnerID
WHERE user.event = 'EventX' 
    AND user.Active = 'True' 
    AND (user.tran_result = '1' OR user.tran_result ='manual' )  
    AND transaction.event = 'EventX' 
    AND (transaction.tran_result = '1' OR transaction.tran_result ='manual' )
GROUP BY user.ID
ORDER BY user.LastName ASC 

我假设它是正在删除这些行的WHERE语句,但是如果我删除WHERE语句并将这些细节作为LEFT JOIN的一部分放置,它似乎只是挂起试图获得结果。 (大约有2,000个用户和40,000个交易)

谢谢!

3 个答案:

答案 0 :(得分:3)

您需要将事务表的条件移动到JOIN条件。将它放入WHERE子句有效地将外连接转换为内连接:

SELECT ....
FROM user
LEFT JOIN transaction 
    ON user.ID = transaction.runnerID 
       AND transaction.event = 'EventX' 
       AND (transaction.tran_result = '1' OR transaction.tran_result ='manual' )
WHERE user.event = 'EventX' 
  AND user.Active = 'True' 
  AND (user.tran_result = '1' OR  user.tran_result ='manual' )
GROUP BY user.ID
ORDER BY user.LastName ASC 

答案 1 :(得分:0)

答案 2 :(得分:0)

您是否尝试将SUM(transaction.Amount)更改为SUM(ISNULL(transaction.Amount, 0))?这将确保将NULL值(即没有匹配的事务)视为0。