mysql嵌套的select语句

时间:2012-11-07 14:46:55

标签: mysql sql

我是关系表的新手。随着我了解更多,我看到了sql语句的许多优点。但是我坚持了一些观点。

我查找是否可以从5个表中获取所需数据集的单个表。其中一个名为'eta'的表用于连接其他4个表。

目的: 许多用户可以使用电话号码或电子邮件,并且用户也可以具有多个电话号码或电子邮件地址。我想列出使用它们的用户名的电话号码或电子邮件地址。

示例数据: 请检查http://sqlfiddle.com/#!2/60acce以获取表结构和示例数据集

手机外壳的最终预期最终结果如下:

  phone            name    extra
  45336467      ABC Co.   
  45336467      Gery      114
  45336467      Todd      117
  45336467      Adam      119

由于

编辑:表关系的说明。

表'eta'有4个具有表关系的字段。列'自己'显示公司,人等等'f'代表公司,'k'代表其他人将用于不同的表

v1_id用于自己字段的引用表的id ..

列'res'指的是电子邮件和电话表。电话的值't'和电子邮件的'e'。 v2_id用于res字段的引用表的id

1 个答案:

答案 0 :(得分:3)

在归档您的架构后,我相信以下查询应该适合您:

SELECT
    phone.tel AS phone,
    CASE WHEN person.name IS NULL THEN company.titles ELSE person.name END AS name,
    eta.extra AS extra
FROM
    eta
    LEFT JOIN person
        ON eta.v1_id = person.id
        AND eta.own = 'k'
    LEFT JOIN company
        ON eta.v1_id = company.id
        AND eta.own = 'f'
    JOIN phone
        ON phone.id = eta.v2_id
WHERE
    eta.res = 't'

如果关系是“电话”表,则假设eta.res = 't'。此外,eta.own = 'k'代表公司,eta.own = 'f'代表公司。

它使用两个左连接从person / company表中提取,以便它可以在单个查询中完成提取。如果person.name列为空,则表示当前记录来自company表,并将选择该值(对于名称列)。

可以选择相同的电子邮件地址(假设eta.res = 'e'与电子邮件表相关):

SELECT
    email.email AS email,
    CASE WHEN person.name IS NULL THEN company.titles ELSE person.name END AS name
FROM
    eta
    LEFT JOIN person
        ON eta.v1_id = person.id
        AND eta.own = 'k'
    LEFT JOIN company
        ON eta.v1_id = company.id
        AND eta.own = 'f'
    JOIN email
        ON email.id = eta.v2_id
WHERE
    eta.res = 'e'