连接具有相同列名的多个表

时间:2015-08-18 00:26:22

标签: mysql sql join ambiguous

我在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自动填充正确的值。

我有种感觉,这实际上是一项非常简单的任务,但对我来说这是一个漫长的工作日,你知道你长时间思考问题并且看不到的日子。可能很容易解决。那么,你能帮助我吗?

另外,抱歉英语不好

2 个答案:

答案 0 :(得分:7)

您可能需要考虑将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;

另一个答案中提到的外连接方法也可以解决问题。

答案 1 :(得分:2)

您可以通过LEFT JOIN完成此任务。在结果字段中,您可以对公共字段IF(fTbl.id IS NULL, cTbl.expiresAt, fTbl.expiresAt) AS expiresAt执行类似的操作。