连接具有相同列名的多个表
Join multiple tables with same column name
我的 MySQL 数据库中有这些 table:
一般table:
+----generalTable-----+
+---------------------+
| id | scenario | ... |
+----+----------+-----+
| 1 | facebook | ... |
| 2 | chief | ... |
| 3 | facebook | ... |
| 4 | chief | ... |
脸书Table:
+----facebookTable-----+
+----------------------+
| id | expiresAt | ... |
+----+-----------+-----+
| 1 | 12345678 | ... |
| 3 | 45832458 | ... |
首席 Table:
+------chiefTable------+
+----------------------+
| id | expiresAt | ... |
+----+-----------+-----+
| 2 | 43547343 | ... |
| 4 | 23443355 | ... |
基本上,一般 table 包含一些(显然)一般数据。基于 generalTable.scenario,您可以在其他两个 table 中查找更多详细信息,它们在某些列中很熟悉(例如 expiresAt),但在其他列中则不是。
我的问题是,如何在一次查询中获取一般Table和右侧详细table的连接数据。
所以,我想要这样的查询:
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"。为了便于使用,我想保持这种状态。结果 table 也应该只有一列 "expiresAt" 自动填充来自 facebookTable 或 chiefTable.
的正确值
我觉得,这实际上是一项非常容易的任务,但对我来说这是一个漫长的工作日,你知道当你思考一个问题很长时间却看不到可能简单的解决方案的时候.那么,你能帮帮我吗?
另外,抱歉英语不好
完成它的一种方法是使用 LEFT JOIN
。在结果字段中,您可以对公共字段执行类似的操作 IF(fTbl.id IS NULL, cTbl.expiresAt, fTbl.expiresAt) AS expiresAt
.
您可能需要考虑将 expiredAt 添加到您的常规 table,并将其从其他项中删除,以消除模式中的重复,并使此特定查询更简单。
如果您需要坚持使用当前架构,可以使用 table 别名来解决名称歧义,并使用两个联接和一个联合来创建您要查找的结果:
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;
另一个答案中提到的外部连接方法也可以解决问题。
我的 MySQL 数据库中有这些 table:
一般table:
+----generalTable-----+
+---------------------+
| id | scenario | ... |
+----+----------+-----+
| 1 | facebook | ... |
| 2 | chief | ... |
| 3 | facebook | ... |
| 4 | chief | ... |
脸书Table:
+----facebookTable-----+
+----------------------+
| id | expiresAt | ... |
+----+-----------+-----+
| 1 | 12345678 | ... |
| 3 | 45832458 | ... |
首席 Table:
+------chiefTable------+
+----------------------+
| id | expiresAt | ... |
+----+-----------+-----+
| 2 | 43547343 | ... |
| 4 | 23443355 | ... |
基本上,一般 table 包含一些(显然)一般数据。基于 generalTable.scenario,您可以在其他两个 table 中查找更多详细信息,它们在某些列中很熟悉(例如 expiresAt),但在其他列中则不是。
我的问题是,如何在一次查询中获取一般Table和右侧详细table的连接数据。
所以,我想要这样的查询:
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"。为了便于使用,我想保持这种状态。结果 table 也应该只有一列 "expiresAt" 自动填充来自 facebookTable 或 chiefTable.
的正确值我觉得,这实际上是一项非常容易的任务,但对我来说这是一个漫长的工作日,你知道当你思考一个问题很长时间却看不到可能简单的解决方案的时候.那么,你能帮帮我吗?
另外,抱歉英语不好
完成它的一种方法是使用 LEFT JOIN
。在结果字段中,您可以对公共字段执行类似的操作 IF(fTbl.id IS NULL, cTbl.expiresAt, fTbl.expiresAt) AS expiresAt
.
您可能需要考虑将 expiredAt 添加到您的常规 table,并将其从其他项中删除,以消除模式中的重复,并使此特定查询更简单。
如果您需要坚持使用当前架构,可以使用 table 别名来解决名称歧义,并使用两个联接和一个联合来创建您要查找的结果:
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;
另一个答案中提到的外部连接方法也可以解决问题。