如何连接MySQL表

6

我有一张像这样的旧表:

user> id | name | address | comments

现在我需要创建一个“别名”表,以允许某些用户出于某种原因拥有别名。我已经创建了一个名为“user_alias”的新表,如下所示:

user_alias> name | user

但是由于我的SQL水平较差,我现在面临一个问题...如何连接这两个表格以生成类似以下的内容:
1 | my_name    | my_address    | my_comments
1 | my_alias   | my_address    | my_comments
2 | other_name | other_address | other_comments

我的意思是,我想要创建一个"SELECT..."查询,以与"user"表格相同的格式返回所有用户和所有别名... 就像这样:

SELECT user.* FROM user LEFT JOIN user_alias ON `user`=`id`

但是对我来说它不起作用。
4个回答

3
我认为你需要类似这样的东西:
SELECT user.*
FROM user
LEFT JOIN user_alias
ON user.name=user_alias.name

您的原始查询在连接条件方面不够具体。


这只为id = 1生成了一行,而不是请求的两行。 - Larry Lustig

2
SELECT user.* FROM user LEFT JOIN user_alias ON user.name = user_alias.name

2

类似这样的内容

SELECT user.name, user.address, user.comment FROM user
UNION ALL
SELECT user_alias.alias, user.address, user.comment 
   FROM user INNER JOIN user_alias on user.name = user_alias.name
ORDER BY name

以下内容可以让您接近所需的结果。

您需要将两个SELECT联合在一起,因为其他人提出的LEFT JOIN解决方案仅会在结果集中包含一个别名用户的行,而不是像您的问题中指定的两个。

但是,您应该使用id列而不是name列作为连接用户和别名的公共列。


完美!这就是解决方案。我不知道这是否是最好的,但它有效!只有一个小错误:SELECT user.name, user.address, user.comment FROM user UNION ALL SELECT user_alias.alias, user.address, user.comment FROM user INNER JOIN user_alias on user.id = user_alias.user ORDER BY name - Ivan
哦,我现在看到你的JOIN了。你应该将user_alias.user重命名为user_alias.user_id,以便更清楚地了解正在发生的事情。 - Larry Lustig

0
首先,你想要构建的查询并不简单,因为你试图跨越多行获取一些结果。所以我会以正确的方式(即数据库开发人员的方式)为你提供一个适当的解决方案。
首先,你应该修改你的user_alias表,使其包含id列而不是名称。使用name字段连接表不是一个好主意。原因是可能会有两个名叫Sarah Connors的人。
然后,你可以使用以下查询从两个表中获取结果:
SELECT user.*, user_alias.*
FROM user LEFT JOIN user_alias
ON user.id=user_alias.id

以这种方式,您将以以下格式获取结果:
id | name         | address      | comments   | user
-------------------------------------------------------------
 1 | Sarah Connor | Planet Earth | Nice woman | sarah_connor
 2 | Sarah Connor | USA, NY      | Mean woman | sarah_c
 3 | John Connor  | USA, NY      | n00b       | john123

user_alias表中,如果同一人有两个或更多记录(相同的id),您将会得到类似以下的结果:
id | name         | address      | comments   | user
-------------------------------------------------------------
 4 | Bill Clinton | White House  | President  | bill
 4 | Bill Clinton | White House  | President  | monica

问题在于,当文件中仅有一个别名时,在结果集中仅会返回一行。但是,OP 想要返回两行(用户行和另一行,将 user_alias 中的别名与匹配的用户行的地址和注释组合在一起)。 - Larry Lustig
更普遍的问题是,当文件中存在任何别名时,您将无法从用户表返回原始未使用别名的行。 - Larry Lustig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接