MYSQL从3个或更多表中选择

时间:2011-03-18 11:42:20

标签: mysql sql database

我需要创建一个MySQL查询来显示来自3个不同表的数据。

这是表1:

TABLE1

  • ID

  • 参考

  • 名称

  • 电子邮件

这是表2:

TABLE2:

  • ID

  • 电话

这是表3:

表3:

  • ID

  • 电话

我需要显示来自table1的所有数据,以及来自table2或table3的电话,只要table2或table3中的id与table1中的引用字段中的数字相同。

有什么建议吗?谢谢!

5 个答案:

答案 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