在sql中是否有一种方法可以使用join,但是在返回的结果中,要获取所有已连接但未加入的行?

时间:2017-11-08 15:38:40

标签: sql

以下是我的数据库结构。

用户

id|username|email               |country|datenumber|
--|--------|-----               |-------|----------|
 1|user1   |example@example.com | GB    |2017-11-08| 
 2|user2   |example@example.com | GB    |2017-11-08| 
 3|user3   |example@example.com | GB    |2017-11-08| 
 4|user4   |example@example.com | GB    |2017-11-08| 
 5|user5   |example@example.com | GB    |2017-11-08| 

faillogs

id|userid  |type        |datenumber|
--|--------|------------|----------|
 1|1       |wronganswer |2017-11-08| 
 2|3       |wronganswer |2017-11-08| 
 3|3       |wronganswer |2017-11-08| 
 4|3       |wronganswer |2017-11-08| 
 5|5       |wronganswer |2017-11-08| 
 6|5       |wronganswer |2017-11-08| 
 7|5       |wronganswer |2017-11-08| 
 8|5       |wronganswer |2017-11-08| 
 9|5       |wronganswer |2017-11-08| 

cashouts

id|userid  |amount      |datenumber|
--|--------|------------|----------|
 1|1       |1.47        |2017-11-08| 
 1|1       |2.97        |2017-11-08| 
 1|2       |1.05        |2017-11-08| 

我的问题是,我如何获取已加入的所有用户,但也列出了faillogs的数量。

以下SQL提取所有用户

SELECT * FROM users

下面的SQL执行连接以获取faillogs。

SELECT *, COUNT(faillogs.userid) FROM users    
INNER JOIN faillogs 
ON users.id=faillogs.userid               
GROUP BY faillogs.userid                          
ORDER BY users.datenumber ASC

我希望能够通过连接获取每个用户的faillog数量的好处,显示所有用户,而不仅仅是具有faillog的用户。我该怎么做?

我这里有一个SQL小提琴。 http://sqlfiddle.com/#!9/56cf4/4

2 个答案:

答案 0 :(得分:1)

您必须使用LEFT JOIN代替INNER JOIN

答案 1 :(得分:1)

使用LEFT JOIN。也按users.id而不是faillogs.userid分组,因为其中一些可能/将是NULL

SELECT users.id, 
       users.username, 
       users.email, 
       users.country, 
       users.datenumber, 
       Count(faillogs.userid) 
FROM   users 
       LEFT JOIN faillogs 
              ON users.id = faillogs.userid 
GROUP  BY users.id, 
          users.username, 
          users.email, 
          users.country, 
          users.datenumber 
ORDER  BY users.datenumber ASC