我试图在此处连接两个表,因此我根据 postStatus 获取特定用户的总行数。没有连接时数据是正确的,但是当我添加连接时,我得到了奇怪的结果。这是怎么发生的?这里使用的正确连接是什么?即使其中一个表中不存在 userId,我也需要返回两个表中的行(或 null)。
**userData**
"postId" "userId" "postStatus" "checked" "postTitle"
"1" "1" "0" "0" "Title 1"
"2" "1" "0" "0" "Title 2"
"3" "1" "0" "0" "Title 3"
"4" "1" "0" "0" "Title 4"
"5" "1" "0" "0" "Title 5"
"6" "1" "1" "0" "Title 6"
"7" "1" "1" "0" "Title 7"
"8" "1" "6" "0" "Title 8"
"9" "1" "5" "0" "Title 9"
"10" "1" "5" "0" "Title 10"
"11" "2" "0" "0" "Title 1"
"12" "2" "0" "0" "Title 2"
"13" "2" "1" "0" "Title 3"
**userDataMod**
"postId" "userId" "postStatus" "checked" "postTitle"
"1" "1" "10" "0" "Title 11"
"2" "1" "10" "0" "Title 12"
"3" "2" "0" "0" "Title 4"
带有连接的 SQL
select
a.userId,
sum(a.postStatus = 0) published,
sum(a.postStatus = 1) inactive,
sum(a.postStatus = 5) recalled,
sum(a.postStatus = 6) deleted,
sum(b.postStatus = 10) unChecked
from userData a join userdatamod b on a.userId = b.userId where a.userId = 1;
// what is the correct join to use here that'll return data (null) from both tables
// even when a userId may not be present in one of them?
结果不正确(请参阅下面的结果。这些是正确的结果)
"userId" "published" "inactive" "recalled" "deleted" "unChecked"
"1" "10" "4" "4" "2" "20"
没有连接的 SQL 可以给出正确的结果
select
a.userId,
sum(a.postStatus = 0) published,
sum(a.postStatus = 1) inactive,
sum(a.postStatus = 5) recalled,
sum(a.postStatus = 6) deleted
from userData a where a.userId = 1;
不使用 join 时的正确结果
"userId" "published" "inactive" "recalled" "deleted"
"1" "5" "2" "2" "1"
//Note: there are 5 rows with postStatus 0 in userData, and 2 with postStaus = 1 and
1 with postsStaus = 6 and so on for userId = 1
正确的方法是什么?
使用 join 时的预期结果
"userId" "published" "inactive" "recalled" "deleted" "unChecked"
"1" "5" "2" "2" "1" "2"
//unChecked = the 2 rows from userDataMod with postStatus = 10 for useId = 1
詹斯
"postId" "userId" "postStatus" "checked" "postTitle" "postId" "userId" "postStatus" "checked" "postTitle"
"1" "1" "0" "0" "Title 1" "1" "1" "10" "0" "Title 1"
"1" "1" "0" "0" "Title 1" "2" "1" "10" "0" "Title 2"
"2" "1" "0" "0" "Title 2" "1" "1" "10" "0" "Title 1"
"2" "1" "0" "0" "Title 2" "2" "1" "10" "0" "Title 2"
"3" "1" "0" "0" "Title 3" "1" "1" "10" "0" "Title 1"
"3" "1" "0" "0" "Title 3" "2" "1" "10" "0" "Title 2"
"4" "1" "0" "0" "Title 4" "1" "1" "10" "0" "Title 1"
"4" "1" "0" "0" "Title 4" "2" "1" "10" "0" "Title 2"
"5" "1" "0" "0" "Title 5" "1" "1" "10" "0" "Title 1"
"5" "1" "0" "0" "Title 5" "2" "1" "10" "0" "Title 2"
"6" "1" "1" "0" "Title 6" "1" "1" "10" "0" "Title 1"
"6" "1" "1" "0" "Title 6" "2" "1" "10" "0" "Title 2"
"7" "1" "1" "0" "Title 7" "1" "1" "10" "0" "Title 1"
"7" "1" "1" "0" "Title 7" "2" "1" "10" "0" "Title 2"
"8" "1" "6" "0" "Title 8" "1" "1" "10" "0" "Title 1"
"8" "1" "6" "0" "Title 8" "2" "1" "10" "0" "Title 2"
"9" "1" "5" "0" "Title 9" "1" "1" "10" "0" "Title 1"
"9" "1" "5" "0" "Title 9" "2" "1" "10" "0" "Title 2"
"10" "1" "5" "0" "Title 10" "1" "1" "10" "0" "Title 1"
"10" "1" "5" "0" "Title 10" "2" "1" "10" "0" "Title 2"
用户数据
CREATE TABLE `userdata` (
`postId` INT(10) NOT NULL AUTO_INCREMENT,
`userId` INT(10) NULL DEFAULT '0',
`postStatus` INT(10) NULL DEFAULT '0',
`checked` INT(10) NULL DEFAULT '0',
`postTitle` VARCHAR(50) NULL DEFAULT '0',
PRIMARY KEY (`postId`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM
AUTO_INCREMENT=14;
userDataMod
CREATE TABLE `userdatamod` (
`postId` INT(10) NOT NULL AUTO_INCREMENT,
`userId` INT(10) NULL DEFAULT '0',
`postStatus` INT(10) NULL DEFAULT '0',
`checked` INT(10) NULL DEFAULT '0',
`postTitle` VARCHAR(50) NULL DEFAULT '0',
PRIMARY KEY (`postId`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM
ROW_FORMAT=DYNAMIC
AUTO_INCREMENT=4;
最佳答案
我认为你必须使用userid
和postId
select
a.userId,
sum(a.postStatus = 0) published,
sum(a.postStatus = 1) inactive,
sum(a.postStatus = 5) recalled,
sum(a.postStatus = 6) deleted,
sum(b.postStatus = 10) unChecked
from userData a join userdatamod b on a.userId = b.userId and a.postId=b.postId where a.userId = 1;
关于MySql 添加联接会给出不正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25153430/