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