Mysql 使用相同的列名联接多个表

Mysql 使用相同的列名联接多个表,mysql,sql,join,ambiguous,Mysql,Sql,Join,Ambiguous,我的MySQL数据库中有以下表: 总表: +----generalTable-----+ +---------------------+ | id | scenario | ... | +----+----------+-----+ | 1 | facebook | ... | | 2 | chief | ... | | 3 | facebook | ... | | 4 | chief | ... | Facebook表格: +----facebookTable-----+

我的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  |
输出如下:

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”。为了便于使用,我想保持这种方式。结果表还应该只有一列“ExpireSet”,该列将自动填充facebookTable或chiefTable中的正确值

我有一种感觉,这实际上是一项非常简单的任务,但对我来说,这是一个漫长的工作日,你知道有多少天你在思考一个问题这么久,却看不到可能简单的解决办法。那么,你能帮我吗


另外,为糟糕的英语感到抱歉

一种方法是使用
左键连接
。在结果字段中,如果(ftBL.ID为NULL,CTBL.ExIPRESAT,FTBL,ExIPRESAT)作为Exabase .< /P> < P>,您可以对普通字段执行类似的操作。您可能需要考虑将ExpIrADAT添加到通用表中,并将其从其他表中删除,以消除模式中的重复,并使此特定查询更简单。p> 如果需要坚持使用当前模式,可以使用表别名来解决名称歧义,并使用两个联接和一个并集来创建要查找的结果:

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;

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

将expiresAt添加到常规表中可能是最好的解决方案,但不幸的是,在这种特定情况下不可能。不过,感谢大家为我们提供的解决方案。那很有魅力!尽管这可能也行得通,但我认为上面mgrant对UNION ALL语句的解决方案不那么复杂,也更容易理解。@bendenfield,我当时想到了,但问题是表有不同的字段,并且没有指定只需要普通字段……但是您仍然可以通过在联合查询中为彼此的唯一字段创建“虚拟”空白字段来实现与联合答案相同的效果。您还可以使用
COALESCE(cTbl.expiresAt,fTbl.expiresAt)
作为
IF()
的替代方法。它更简单,允许您有两个以上的选项,而无需链接多个
IF