【问题标题】:mysql nested select statementmysql嵌套选择语句
【发布时间】:2012-11-07 23:08:34
【问题描述】:

我是关系表的新手。随着我了解的更多,我看到了 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 for 自己字段的引用表的 id..

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

【问题讨论】:

  • 你能解释一下表之间的关系吗?
  • eta 与其他任何表有何关系?退回上述内容的标准是什么?如果一个人可以有多个电话号码,您希望返回哪一个?
  • 具体来说,eta 表中的字段如何与其他表关联

标签: mysql sql


【解决方案1】:

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

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'

【讨论】:

  • 它完美无瑕,检查SQL Fiddle code. +1 以了解“猜测”关系,当你发布答案时我还在猜测
  • 太棒了!!它完美无缺。我们可以通过为“部门”再添加一张表来使用它吗?它检查空状态,如果有三个表怎么办?
  • @aliaktas 是的,您应该可以添加任意数量的表格。对于每个表,您只需添加LEFT JOIN new_table ON eta.v1_id = new_table.id AND eta.own = '?'。此外,您需要将CASE 语句更改为CASE WHEN person.name IS NOT NULL THEN person.name WHEN company.titles IS NOT NULL THEN company.titles ELSE new_table.name_field END AS name(注意,我在这里将其更改为IS NOT NULL
猜你喜欢
  • 2019-02-04
  • 1970-01-01
  • 2017-09-15
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多