Mysql 在同一个表中连接两个foregin键引用同一个主键
我正试图将多个表(Mysql 在同一个表中连接两个foregin键引用同一个主键,mysql,join,foreign-keys,relational-database,mysql-workbench,Mysql,Join,Foreign Keys,Relational Database,Mysql Workbench,我正试图将多个表(BooksReview,Followers,Books)与用户表连接起来,Books引用了用户ID,BooksReviewreferencesuserId哪个是查看一本书的userId,引用了BooksReview中的booksid哪个是在Followers表上查看过的图书id(我认为问题在哪里)从Users表中的userId和Users表中的用户id中的同一主键中有两个引用,并从userId中有两个引用 问题:我创建了一个MySQL查询,根据特定用户获取特定图书的书评数量,并
BooksReview
,Followers
,Books
)与用户
表连接起来,Books
引用了用户ID
,BooksReview
referencesuserId
哪个是查看一本书的userId
,引用了BooksReview
中的booksid
哪个是在Followers
表上查看过的图书id(我认为问题在哪里)从Users
表中的userId
和Users
表中的用户id
中的同一主键中有两个引用,并从userId
中有两个引用
问题:我创建了一个MySQL查询,根据特定用户获取特定图书的书评数量,并获取该用户的图书数量和他/她拥有的追随者数量,但当我将followers
join部分添加到我的查询中时,所有值的结果显示为0,预期值为4本书,4篇评论,和1名追随者
我曾尝试更改查询中的连接类型,但结果相同,并在同一个表中搜索将两个foregin键连接到同一个主键,但没有发现任何有用的结果
```
CREATE TABLE IF NOT EXISTS `Authors`.`Users` (
`userId` VARCHAR(100) NOT NULL,
`username` VARCHAR(25) NOT NULL,
`password` VARCHAR(16) NOT NULL,
`email` VARCHAR(254) NOT NULL,
`birthday` DATE NULL,
`aboutMe` TEXT(300) NOT NULL,
`facebookAccount` VARCHAR(25) NULL,
`twitterAccount` VARCHAR(25) NULL,
`linkedinAccount` VARCHAR(25) NULL,
`profileImage` VARCHAR(200) NULL,
PRIMARY KEY (`userId`),
UNIQUE INDEX `username_UNIQUE` (`username` ASC),
UNIQUE INDEX `email_UNIQUE` (`email` ASC))
ENGINE = InnoDB;
```
我希望结果应该是1个追随者,4本书和4篇评论
但实际结果是所有人都是0
DML:
用户
->
userId: dbb21849-ccce-4af1-aa0f-6653919bf956
username: mostafabbbaron
userId: dbb21849-ccce-4af1-aa0f-6653919bf956
bookId: 5f39c1ae-5e99-4b3a-8ee0-97a80c1ba9b1
follower: dbb21849-ccce-4af1-aa0f-6653919bf956
folllowed: b39c8e0c-4124-4339-8c30-e1fc8db5f2d4
userId: dbb21849-ccce-4af1-aa0f-6653919bf956
bookId: aa44a455-dc28-476f-b4b9-47563a717f03
等等
书籍
->
userId: dbb21849-ccce-4af1-aa0f-6653919bf956
username: mostafabbbaron
userId: dbb21849-ccce-4af1-aa0f-6653919bf956
bookId: 5f39c1ae-5e99-4b3a-8ee0-97a80c1ba9b1
follower: dbb21849-ccce-4af1-aa0f-6653919bf956
folllowed: b39c8e0c-4124-4339-8c30-e1fc8db5f2d4
userId: dbb21849-ccce-4af1-aa0f-6653919bf956
bookId: aa44a455-dc28-476f-b4b9-47563a717f03
等等
追随者
->
userId: dbb21849-ccce-4af1-aa0f-6653919bf956
username: mostafabbbaron
userId: dbb21849-ccce-4af1-aa0f-6653919bf956
bookId: 5f39c1ae-5e99-4b3a-8ee0-97a80c1ba9b1
follower: dbb21849-ccce-4af1-aa0f-6653919bf956
folllowed: b39c8e0c-4124-4339-8c30-e1fc8db5f2d4
userId: dbb21849-ccce-4af1-aa0f-6653919bf956
bookId: aa44a455-dc28-476f-b4b9-47563a717f03
等等
书评
->
userId: dbb21849-ccce-4af1-aa0f-6653919bf956
username: mostafabbbaron
userId: dbb21849-ccce-4af1-aa0f-6653919bf956
bookId: 5f39c1ae-5e99-4b3a-8ee0-97a80c1ba9b1
follower: dbb21849-ccce-4af1-aa0f-6653919bf956
folllowed: b39c8e0c-4124-4339-8c30-e1fc8db5f2d4
userId: dbb21849-ccce-4af1-aa0f-6653919bf956
bookId: aa44a455-dc28-476f-b4b9-47563a717f03
等等。无论哪种方式,您的查询都是错误的。但结果为零的原因可能是以下条件:
b.userId=u.userId
和b.userId=f.followered和f.follower=u.userId
如果b.userId=u.userId
和b.userId=f.followed
则f.followed=u.userId
如果f.followed=u.userId
和f.follower=u.userId
则f.followed=f.follower
这意味着用户必须遵循他/她自己,我对此表示怀疑
我将按以下方式编写查询:
SELECT
count(DISTINCT b.bookId) AS booksCount,
count(br.bookId) AS reviewsCount,
(SELECT COUNT(*) FROM Followers AS f WHERE f.followed = u.userId) AS followersCount
FROM Users AS u
LEFT JOIN Books AS b ON b.userId = u.userId
LEFT JOIN BooksReview AS br ON br.bookId = b.bookId
WHERE u.userId = 'dbb21849-ccce-4af1-aa0f-6653919bf956'
注意:虽然让
用户离开JOIN Books离开JOIN BooksReview也没关系,但因为您有一个“关系链”用户,您的查询无论哪种方式都是错误的。但结果为零的原因可能是以下条件:b.userId=u.userId
和b.userId=f.followered和f.follower=u.userId
如果b.userId=u.userId
和b.userId=f.followed
则f.followed=u.userId
如果f.followed=u.userId
和f.follower=u.userId
则f.followed=f.follower
这意味着用户必须遵循他/她自己,我对此表示怀疑
我将按以下方式编写查询:
SELECT
count(DISTINCT b.bookId) AS booksCount,
count(br.bookId) AS reviewsCount,
(SELECT COUNT(*) FROM Followers AS f WHERE f.followed = u.userId) AS followersCount
FROM Users AS u
LEFT JOIN Books AS b ON b.userId = u.userId
LEFT JOIN BooksReview AS br ON br.bookId = b.bookId
WHERE u.userId = 'dbb21849-ccce-4af1-aa0f-6653919bf956'
注意:虽然让用户离开JOIN Books LEFT JOIN BooksReview
是可以的,但因为您有一个“关系链”用户很好看,您可以修复我的答案。但是您可以在子查询中使用u.userId
,而不是硬编码的'dbb21849-ccce-4af1-aa0f-6653919bf956'
。这样可以避免重复应用,只需在一个位置进行更改。感谢您的有用回复,但distinct关键字已经消除了重复。我的意思是,您不需要像在编辑中那样在查询中编写两次“dbb21849-ccce-4af1-aa0f-6653919bf956”
。很高兴看到,您可以修复我的答案。但是您可以在子查询中使用u.userId
,而不是硬编码的'dbb21849-ccce-4af1-aa0f-6653919bf956'
。这样可以避免重复应用,只需在一个位置进行更改。感谢您的有用回复,但distinct关键字已经消除了重复。我的意思是,您不需要像在编辑中那样在查询中两次编写“dbb21849-ccce-4af1-aa0f-6653919bf956”。