gpt4 book ai didi

mysql - 如何使 SELECT "knows"哪个实体具有更多元素?

转载 作者:搜寻专家 更新时间:2023-10-30 20:18:09 25 4
gpt4 key购买 nike

我有一个简单的数据库,它包含三个表(companyphoneemail),它们通过规则关联:

  • 一家公司可能有零个或多个电话号码;
  • 一家公司可能有零个或多个电子邮件地址。

这是 MySQL 代码:Pastebin


假设有以下两种情况:

  • 一家公司有 3 个电话和 2 个电子邮件(案例 1)
  • 一家公司有 2 个电话和 3 个电子邮件(情况 2)

~

我想创建一个返回以下内容的 SELECT:

案例一

Company         Phone       E-mail
--------------------------------------------
Test Company 1111222 export@testco.co
Test Company 2222222 import@testco.co
Test Company 3333222
--------------------------------------------

案例二

Company         Phone       E-mail
--------------------------------------------
Test Company 1111222 export@testco.co
Test Company 2222222 import@testco.co
Test Company sales@testco.co
--------------------------------------------

对于给定的公司,SELECT 应该“知道”哪个实体具有更多元素(phoneemail),然后返回一个结果,其中数字行数等于具有更多元素的实体中的元素数(phone 在情况 1 中;email 在情况 2 中)。

我不知道该怎么做。这是我能做的最好的:Pastebin

最佳答案

这在 MySQL 中很难做到,但它是可能的。这是逻辑。枚举每个公司的电子邮件和电话的值。然后根据公司和序列号聚合这些:

select ep.company, min(ep.email) as email, min(ep.phone) as phone
from ((select e.company, e.email, NULL as phone,
(@rne := if(@company = company, @rne + 1, if(@company := company, 1, 1)) ) as seqnum
from email e cross join
(select @rne := 0, @company := '') vars
order by e.company
) union all
(select p.company, NULL, p.phone,
(@rnp := if(@companyp = company, @rnp + 1, if(@companyp := company, 1, 1)) ) as seqnum
from phone p cross join
(select @rnp := 0, @companyp := '') vars
order by p.company
)
) ep
group by ep.company, ep.seqnum
order b ep.company, ep.seqnum;

表达式:

 (@rne := if(@company = company, @rne + 1, if(@company := company, 1, 1)) ) as seqnum

设置seqnum 是一种在MySQL 中安全使用变量的方法。请注意,MySQL 不保证 select 中表达式的求值顺序,因此更自然:

 @rne := if(@company = company, @rne + 1, 1), @company := company

可能不起作用,因为第二个将首先被评估。这种带有嵌套赋值的方法没有这个问题。

关于mysql - 如何使 SELECT "knows"哪个实体具有更多元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24507901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com