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
references
userId
哪个是查看一本书的
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”。