我需要进行MySQL查询以显示来自3个不同表的数据。MYSQL从3个或更多表中选择
这是表1:
TABLE1
ID
参考
名
电子邮件
这是表2:
TABLE2:
ID
电话
这是表3:
表3:
ID
电话
我需要证明从表1,从表2或表3的所有数据,并且还手机,只有在表2或表3的ID与table1中参考字段中的数字相同。
有什么建议吗?谢谢!
我需要进行MySQL查询以显示来自3个不同表的数据。MYSQL从3个或更多表中选择
这是表1:
TABLE1
ID
参考
名
电子邮件
这是表2:
TABLE2:
ID
电话
这是表3:
表3:
ID
电话
我需要证明从表1,从表2或表3的所有数据,并且还手机,只有在表2或表3的ID与table1中参考字段中的数字相同。
有什么建议吗?谢谢!
你可以尝试像
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
SELECT t1.*, t2.*, t3.*
FROM table1 t1 JOIN table2 t2
ON t1.reference = t2.ID
JOIN table3 t3
ON t1.reference = t3.ID
我不知道你是否能在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
是的,我有一个建议,修改你的结构。用不同的表格来保存不同的电话号码是没有意义的。 这里的东西,你可以这样做:
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或表3。
因为这2个表有相同的列,我们可以简化这件事,想想这2个表作为一个单一的一个,通过使用UNION子句:
select table1.*, v.phone
from table1
inner join (select * from table2
union
select * from table3) v on v.id = table1.reference
编辑:更正表名的工会
我认为你应该使用'INNER JOIN',而不是'LEFT JOIN',因为OP需求*显示从表1的所有数据,并且还从表2或表3的电话,* ***只有*** * table2或table3中的id与table1 *中参考字段中的相同。 – 2011-03-18 12:51:52
如果'table2'和'table3'包含具有相同'id'和不同电话号码的行,此解决方案可以复制'table1'行。 – 2011-03-18 12:53:47
@Andriy M同意,我忽略了这一点。编辑完成。谢谢! – 2011-03-18 12:54:44
不工作,则返回0项,在表1中的参考将在表2表3或,而不是在时刻2页的表。 – nmarti 2011-03-18 11:54:11