我的架构(Mysql 5.6.24)的相关部分是:
table: training_event_invitees
registered (tinyint)
invitee_id (id)
invitee_type (varchar)
table: users
id (integer)
email (varchar)
school_id (integer)
table: contacts
id (integer)
email (varchar)
school_id (integer)
table: schools
id (integer)
email (varchar)
我想尝试执行以下操作:获取所有已注册设置为1的training_event_invitees,获取关联的学校、用户和联系人记录,然后按school_id对它们进行分组,并返回学校id和唯一的计数该学校的电子邮件地址。
training_event_invitees有一个两列外键,使用invitee_id和invitee_type:invitee_type可以是“School”、“User”或“Contact”,并引用相应表中的id字段。
所以,从算法上来说,它就像
- get all the registered training_event_invitees
- get all of the associated user, contact and school records
- group these by users.school_id, contacts.school_id or schools.id
- count the number of distinct emails in each group
所以,它应该返回一个像这样的数组 [ [1234, 6], [3407, 2] ]
其中 1234 和 3407 是 school_id 的值,6 和 2 是不同电子邮件的计数。
我可以将其分解为几个步骤,但必须有一种一键完成的方法。有人可以帮忙吗?
最佳答案
一种方法是使用左连接
组合两个表,然后进行聚合:
select coalesce(u.school_id, c.school_id) as school_id,
count(distinct coalesce(u.email, c.email)) as num_emails
from training_event_invitees tei left join
users u
on u.id = tei.invitee_id and tei.invitee_type = 'user' left join
contacts c
on c.id = tei.invitee_id and tei.invitee_type = 'contact'
where tei.registered = 1
group by coalesce(u.school_id, c.school_id);
编辑:
要包含学校,请遵循相同的逻辑:
select coalesce(u.school_id, c.school_id, s.id) as school_id,
count(distinct coalesce(u.email, c.email, s.email)) as num_emails
from training_event_invitees tei left join
users u
on u.id = tei.invitee_id and tei.invitee_type = 'user' left join
contacts c
on c.id = tei.invitee_id and tei.invitee_type = 'contact' left join
schools s
on s.id = tei.invitee_id and tei.invitee_type = 'school'
where tei.registered = 1
group by coalesce(u.school_id, c.school_id, s.id);
关于Mysql:通过多态连接对关联表中的唯一电子邮件进行计数和分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46523916/