我需要创建一个MySQL查询来显示来自3个不同表的数据。
这是表1:
TABLE1
ID
参考
名称
电子邮件
这是表2:
TABLE2:
ID
电话
这是表3:
表3:
ID
电话
我需要显示来自table1的所有数据,以及来自table2或table3的电话,只要table2或table3中的id与table1中的引用字段中的数字相同。
有什么建议吗?谢谢!
答案 0 :(得分:3)
您可以尝试类似
的内容SELECT t1.*
COALESCE(t2.phone,t3.phone) phone
FROM Table1 t1 LEFT JOIN
Table2 t2 ON t1.reference = t2.id LEFT JOIN
Table3 t3 ON t1.reference = t3.id
查看COALESCE(value,...)和SQL SERVER – Introduction to JOINs – Basic of JOINs
答案 1 :(得分:2)
是的,我有一个建议,修改你的结构。使用不同的表来保存不同的电话号码毫无意义。 这是你可以做的事情:
table1( -- you should give it a better name
id,
-- reference, -- not needed now...
name,
email
);
phone_numbers(
id,
table1_id,
phone
);
现在您可以执行以下操作:
SELECT table1.*, GROUP_CONCAT(phone)
FROM table1
LEFT JOIN phone_numbers ON table1.id = table1_id
GROUP BY table1.id, name, email -- , whatever fields you have more on table1
答案 2 :(得分:1)
您要求来自table2或来自table3的电话。
因为这两个表有共同的列,所以我们可以通过使用UNION子句来简化这一整个过程,并将这两个表视为一个表:
select table1.*, v.phone
from table1
inner join (select * from table2
union
select * from table3) v on v.id = table1.reference
编辑:修正了联盟中的表名
答案 3 :(得分:0)
SELECT t1.*, t2.*, t3.*
FROM table1 t1 JOIN table2 t2
ON t1.reference = t2.ID
JOIN table3 t3
ON t1.reference = t3.ID
答案 4 :(得分:0)
我不知道你是否可以在mysql中选择CASE语句,但你可以尝试将CASE语句作为列并加入。这是一些sudo代码。
SELECT t1.*, CASE t2.phone IS NOT t3.phone THEN t3.phone ELSE t2.phone END CASE as PhoneNumber
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.reference = t2.id
LEFT JOIN Table3 t3 ON t1.reference = t3.id