2

我正在尝试根据上面的架构让所有会说英语和法语的用户。我怎样才能做到这一点?

我试过类似的东西:

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"

SQL 架构

4

7 回答 7

3

我正在使用一个子查询来计算每个用户所说的语言(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
)
于 2013-10-14T14:09:59.597 回答
2

改变你的条件从

WHERE Language.name = "FR" AND Language.name = "EN"

WHERE (Language.name = "FR" OR Language.name = "EN")

您不应该在数据库中有一个条目对单个字段有两个值,但是如果您使用“OR”运算符,则如果任一值相等,您应该选择该条目。

于 2013-10-14T14:06:54.980 回答
2
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)
于 2013-10-14T14:14:45.320 回答
1
 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")
于 2013-10-14T14:19:21.290 回答
1

始终尝试从圆的“中心”的角度来看待连接。在这种情况下,您尝试通过 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');
于 2013-10-14T14:09:14.233 回答
0

您必须将 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'
于 2013-10-14T14:15:13.200 回答
0
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
于 2013-10-14T14:12:28.800 回答