2011-03-18 49 views
0

我需要进行MySQL查询以显示来自3个不同表的数据。MYSQL从3个或更多表中选择

这是表1:

TABLE1

  • ID

  • 参考

  • 电子邮件

这是表2:

TABLE2:

  • ID

  • 电话

这是表3:

表3:

  • ID

  • 电话

我需要证明从表1,从表2或表3的所有数据,并且还手机,只有在表2或表3的ID与table1中参考字段中的数字相同。

有什么建议吗?谢谢!

回答

0
SELECT t1.*, t2.*, t3.* 
FROM table1 t1 JOIN table2 t2 
    ON t1.reference = t2.ID 
JOIN table3 t3 
    ON t1.reference = t3.ID 
+0

不工作,则返回0项,在表1中的参考将在表2表3或,而不是在时刻2页的表。 – nmarti 2011-03-18 11:54:11

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 
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 
+0

您好,我简化了表这个例子,但我使用diferents表,因为是在diferent课程的字样,并且数据到表中了,所以我不能修改的结构:/ – nmarti 2011-03-18 11:53:01

+0

@nmarti,好吧,但我无法猜测。从你的问题,我能看到的唯一的事情就是你的结构不应该是这样,修改它会有帮助。而且我仍然相信有两张表保存相同类型的数据没有意义。 : -/ – acm 2011-03-18 11:56:15

1

你问一个电话从表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 

编辑:更正表名的工会

+0

我认为你应该使用'INNER JOIN',而不是'LEFT JOIN',因为OP需求*显示从表1的所有数据,并且还从表2或表3的电话,* ***只有*** * table2或table3中的id与table1 *中参考字段中的相同。 – 2011-03-18 12:51:52

+0

如果'table2'和'table3'包含具有相同'id'和不同电话号码的行,此解决方案可以复制'table1'行。 – 2011-03-18 12:53:47

+0

@Andriy M同意,我忽略了这一点。编辑完成。谢谢! – 2011-03-18 12:54:44