我的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;
另一个答案中提到的外部联接方法也可以解决该问题。