Mysql:通过多态连接对关联表中的唯一电子邮件进行计数和分组

标签 mysql sql join

我的架构(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/

相关文章:

php - 从表中获取值并将该值提交到另一个表 mysql php

javascript - Highcharts 和 PHP

MySQL SELECT 查询具有多个表的联结表

Python 不会写入列表中的所有条目

mysql - 正向工程mysql工作台

java - 准备语句根据记录中的另一个值更新一个值

mysql - 复杂定价矩阵的数据库结构

mysql - 对mysql时间间隔的值求平均值

php - 在 php/mysql 表中使用多重连接作为对象或类似的东西

php - 将 MySQL SELECT 查询与 IF 语句结合起来