mysql – 连接具有相同列名的多个表
作者:互联网
我在MySQL数据库中有这些表:
一般表:
+----generalTable-----+
+---------------------+
| id | scenario | ... |
+----+----------+-----+
| 1 | facebook | ... |
| 2 | chief | ... |
| 3 | facebook | ... |
| 4 | chief | ... |
Facebook表:
+----facebookTable-----+
+----------------------+
| id | expiresAt | ... |
+----+-----------+-----+
| 1 | 12345678 | ... |
| 3 | 45832458 | ... |
主席表:
+------chiefTable------+
+----------------------+
| id | expiresAt | ... |
+----+-----------+-----+
| 2 | 43547343 | ... |
| 4 | 23443355 | ... |
基本上,通用表包含一些(显然)通用数据.基于generalTable.scenario,您可以在其他两个表中查找更多详细信息,这些表在熟悉的某些列中(例如expiresAt),但在其他列中则没有.
我的问题是,如何在一个查询中获取generalTable的连接数据和正确的详细表.
所以,我想要一个像这样的查询:
SELECT id, scenario, expiresAt
FROM generalTable
JOIN facebookTable
ON generalTable.id = facebookTable.id
JOIN chiefTable
ON generalTable.id = chiefTable.id
这样的输出:
| id | scenario | expiresAt |
+----+----------+-----------+
| 1 | facebook | 12345678 |
| 2 | chief | 43547343 |
| 3 | facebook | 45832458 |
| 4 | chief | 23443355 |
但是,这不起作用,因为facebookTable和chiefTable都有不明确的列名“expiresAt”.为了便于使用,我想保持这种方式.结果表也应该只有一列“expiresAt”,它自动填充来自facebookTable或chiefTable的正确值.
我有一种感觉,这实际上是一项非常简单的任务,但对我来说这是一个漫长的工作日,你知道你长时间思考问题并且看不到可能简单的解决方案的日子.那么,你能帮帮我吗?
还有,对不起英语不好
解决方法:
您可能需要考虑将expiredAt添加到常规表中,并将其从其他表中删除,以删除模式中的重复,并使此特定查询更简单.
如果您需要坚持使用当前架构,可以使用表别名来解析名称歧义,并使用两个联接和一个联合来创建您要查找的结果:
SELECT g.id, g.scenario, f.expiresAt
FROM generalTable g
JOIN facebookTable f
ON g.id = f.id
UNION ALL
SELECT g.id, g.scenario, c.expiresAt
FROM generalTable g
JOIN chiefTable c
ON g.id = c.id;
另一个答案中提到的外连接方法也可以解决问题.
标签:ambiguous,sql,mysql,join 来源: https://codeday.me/bug/20190724/1527096.html