我正在尝试根据上面的架构让所有会说英语和法语的用户。我怎样才能做到这一点?
我试过类似的东西:
SELECT * FROM User
INNER JOIN UserLanguage on User.idUser = UserLanguage.idUser
INNER JOIN Language on UserLanguage.idLanguage = Language.idLanguage
WHERE Language.name = "FR" AND Language.name = "EN"

我正在使用一个子查询来计算每个用户所说的语言(FR 或 EN)的数量。然后它返回所有使用这两种语言的用户的所有 id。外部查询返回每个用户的所有列:
SELECT Users.*
FROM Users
WHERE idUser IN (
SELECT UserLanguage.idUser
FROM
UserLanguage INNER JOIN Language
ON UserLanguage.idLanguage = Language.idLanguage
WHERE
Language.name IN ("FR", "EN")
GROUP BY
UserLanguage.idUser
HAVING
COUNT(DISTINCT Language.name)=2
)
改变你的条件从
WHERE Language.name = "FR" AND Language.name = "EN"
至
WHERE (Language.name = "FR" OR Language.name = "EN")
您不应该在数据库中有一个条目对单个字段有两个值,但是如果您使用“OR”运算符,则如果任一值相等,您应该选择该条目。
SELECT *
FROM User
WHERE 2 = (SELECT COUNT(*)
FROM UserLanguage
INNER JOIN Language
ON UserLanguage.idLanguage = Language.idLanguage
AND (Language.name = 'FR' OR Language.name = 'EN')
WHERE User.idUser = UserLanguage.idUser)
SELECT * FROM User
INNER JOIN UserLanguage on User.idUser = UserLanguage.idUser
INNER JOIN Language on UserLanguage.idLanguage = Language.idLanguage
WHERE Language.name = "FR" AND Language.name = "EN"
你只需要改变
WHERE Language.name = "FR" AND Language.name = "EN"
至
WHERE (Language.name = "FR" OR Language.name = "EN")
始终尝试从圆的“中心”的角度来看待连接。在这种情况下,您尝试通过 UserLanguage 将“用户”加入“语言”,因此您的 FROM 表需要是“用户语言”。
所以基本上你在看:
SELECT * FROM UserLanguage
INNER JOIN User ON Userlanguage.idUser = User.idUser
INNER JOIN Language on Userlanguage.idLanguage = Language.idLanguage
WHERE (Language.Name = 'EN' OR Language.Name = 'FR');
您必须将 UserLanguage 表加入到自身中,例如:
SELECT T1.idUser
FROM UserLanguage AS T1
INNER JOIN UserLanguage AS T2
ON T1.idUser=T2.idUser
WHERE T1.idLanguage='EN'
AND T2.idLanguage='FR'
SELECT *
FROM Users u INNER JOIN UserLanguage ul
ON u.idUser = ul.idUser JOIN Language l
ON ul.idLanguage = l.idLanguage
WHERE l.LanguageName IN ('EN', 'FR')
ORDER BY u.idUser