Mysql 是否需要使用游标来实现以下查询?

Mysql 是否需要使用游标来实现以下查询?,mysql,database,cursor,Mysql,Database,Cursor,以数据库为例: 一家公司有零家或多家分公司 一家公司没有或有更多的电子邮件 分支具有零封或多封电子邮件 并考虑该数据库的以下实例: 1家公司,2家分公司 该公司有1封电子邮件 每个分支机构有2封电子邮件 (共5封电子邮件) 如果愿意,请检查该实例的名称 查询 我想做一个查询(MySQL),检索与给定公司相关的所有电子邮件(示例中为5)。我找不到解决办法,所以在谷歌搜索了一下后,我发现有一个东西叫做 问题: 是否需要使用游标来实现上述查询?这是一个好的解决方案吗?您对上述问题的解决

以数据库为例:

  • 一家公司有零家或多家分公司
  • 一家公司没有或有更多的电子邮件
  • 分支具有零封或多封电子邮件

并考虑该数据库的以下实例:

  • 1家公司,2家分公司
  • 该公司有1封电子邮件
  • 每个分支机构有2封电子邮件
(共5封电子邮件)

如果愿意,请检查该实例的名称


查询 我想做一个查询(MySQL),检索与给定公司相关的所有电子邮件(示例中为5)。我找不到解决办法,所以在谷歌搜索了一下后,我发现有一个东西叫做


问题:
  • 是否需要使用游标来实现上述查询?这是一个好的解决方案吗?您对上述问题的解决方案是什么
(表定义如下)


我的想法是检索给定公司的所有分支(我可以进行查询),但从那里我不知道如何迭代分支(查询结果)并获取所有电子邮件


MySQL中的表定义
不,这不需要光标。使用SQL可以做到这一点——比使用游标要好得多。有点像:

select *
from ((select ce.c_id, e.email
       from c_email ce join
            email e
            on e.e_id = ce.e_id
      ) union all
      (select b.c_id, e.email
       from branch b join
            b_email be
            on b.b_id = be.b_id join
            email e
            on be.e_id = e.e_id
      )
     ) e
where ce.c_id = X;
编辑:

您可以将
b_id
添加到第二个子查询中,但不能添加到第一个子查询中。也许你可以:

select *
from ((select ce.c_id, e.email, NULL as b_id
       from c_email ce join
            email e
            on e.e_id = ce.e_id
      ) union all
      (select b.c_id, e.email, b.b_id
       from branch b join
            b_email be
            on b.b_id = be.b_id join
            email e
            on be.e_id = e.e_id
      )
     ) e
where ce.c_id = X
order by c_id, b_id;

我不确定您在将条目分为公司表和分支表时的逻辑是否正确。此外,您不应该将电子邮件拆分为多个表。您的意思是您更喜欢一个包含所有电子邮件的电子邮件表吗?就是这样!表
c\u-email
b\u-email
只是将
公司
/
分支机构
与表
email
建立关系。如果您想在我的设计中获得更多信息,请检查,我不知道我是否完全理解您的评论(很抱歉,我没有!)您可以通过将所有实体建立为“公司”,使用类型字段(将其标识为顶级公司与分支机构),简化您的设计并降低查询复杂性,然后只要有
email
就可以直接参考
c_id
列(每个实体都是唯一的)。然后,分支表可以简单地容纳父子关系(不需要复制名称列)@Noah这是个好主意,我从来没有想到过。我将(尝试)分析查询复杂性增益(如您所见,这是我第一次编程SQL)。谢谢。我发誓,每次我打开MySQL问题列表,你都在这里,这是你的查询,只需稍加修改:(添加b_id列)。我尝试按b_id:订购,但未成功。我该怎么点呢?@feelthis。您不能真正按
b_id
订购,因为这些信息对公司不可用。您将如何处理它们?您的(添加了b_id)返回一个包含三列(c_id、b_id(如果可用)、e_addr)的表。我想按b_id订购那张桌子,但正如你所指出的,我做不到。那么唯一的方法就是构建一个不同的查询?(请容忍我对SQL的缺乏知识:)你的编辑成功了!关键是b_id的铸造
。(我可以称之为a吗?:)非常感谢!
select *
from ((select ce.c_id, e.email, NULL as b_id
       from c_email ce join
            email e
            on e.e_id = ce.e_id
      ) union all
      (select b.c_id, e.email, b.b_id
       from branch b join
            b_email be
            on b.b_id = be.b_id join
            email e
            on be.e_id = e.e_id
      )
     ) e
where ce.c_id = X
order by c_id, b_id;