在之前的一个问题中,我被告知如果我想为用户存储多种语言,那么最好有一个单独的表将语言和用户映射在一起。 这是有道理的,因为它是一个典型的多对多关系,所以这就是我所做的。
我现在的问题是我可以编写什么查询来连接每个用户的所有语言名称,然后将其显示为表格?
我做了以下(这是正确的吗?):
CREATE TABLE language (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name char(20) NOT NULL UNIQUE)
CREATE TABLE user (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name char(20) NOT NULL UNIQUE)
CREATE TABLE user_language (
id_user INT REFERENCES user(id),
id_lang INT REFERENCES language(id) )
然后我插入了3个测试用户,7种测试语言,并在user_language表中插入了9对。现在我想使用一个MySQL查询打印每个用户在用户名旁边说的语言的连接列表,我不知道如何做到这一点。 所以我想看看
User | Languages
--------|---------------
Bob | English, French
Alex | Spanish, Portuguese
Ivan | Russian, English, German
有什么想法吗?我甚至走在正确的轨道上吗?
修改
我知道JOIN功能,所以打印列表作为一组单独的对不是我的意图。我特别希望为每个用户连接语言而不需要在脚本中编写循环(在我的情况下它将在PHP中)。 我想可能有一些编写子查询的方法,并使用可能能够帮助我的CONCATENATE函数......?我离开了吗?
答案 0 :(得分:1)
你想看看为此使用INNER JOIN。本质上,JOIN将查看每个字段中的ID,然后将数据匹配在一起以查找具有匹配ID的条目。
考虑以下SQL查询:
SELECT user.*, language.name FROM user
INNER JOIN user_language ON user.id = user_language.id_user
INNER JOIN language ON user_language.id_lang = language.id;
INNER JOIN的顺序很重要;我们需要做的第一件事是能够引用相对于用户ID的语言ID。第一个INNER JOIN将为每个用户提供用户可以说的语言ID列表。第二种是将分配给用户的语言ID映射到名称。
但是,上述内容不会以逗号分隔的列表返回。相反,你会得到这样的东西:
name | language
-------------------------
bob | English
bob | Dutch
Sally | English
Sally | Spanish
Sally | German
您必须进行一些后期处理才能将数据放入以逗号分隔的列表中。几乎任何语言都这样做应该相当简单。
答案 1 :(得分:0)
select a.name, b.name from language a, user b where id_user = b.id and id_lang = a.id;
答案 2 :(得分:0)
是的,这是一个完全有效的设计。
SELECT user.name, language.name FROM user INNER JOIN user_language ON(user.id = user_language.id_user) INNER JOIN language ON(language.id_lang = language.id);
答案 3 :(得分:0)
SELECT u.name as user, l.name as language
FROM USER u
INNER JOIN user_language ul ON u.id = ul.id_user
INNER JOIN LANGUAGE l ON ul.id_lang = l.id;