MySQL按两个不同维度分组

标签 mysql

如果我有一张 table

`account`, `account_contact`, `contact_event` and `event`

并且存在以下 FK

`account_contact`: `account_id`,`contact_id`
`contact_event`: `contact_id`, `event_id`

如何查询与该帐户和事件关联的所有联系人的“总票数”的帐户出席频率,以及该帐户的联系人参加的事件的不同数量。

我有以下内容,但是 JOIN 导致第一个子查询返回具有相同值的重复 Ticket's Sold 行。

SELECT a1.id,`Tickets Sold`, a2.`Distinct Events Attended` FROM

(SELECT a.id, count(*) `Tickets Sold`
 FROM account a JOIN account_contact ac
     ON ac.active = 1 AND a.id=ac.account_id
 JOIN contact_event ce
     ON ac.contact_id=ce.contact_id
 JOIN event e
     ON ce.event_id=e.id AND ce.role = 'Checked In'
 WHERE e.date_start >= '2015-12-31' AND e.date_end < '2017-01-01' 
 GROUP BY a.id ) a1

LEFT JOIN

(SELECT a.id,count(*) `Distinct Events Attended`
 FROM account a
 JOIN account_contact ac
     ON a.id=ac.account_id AND ac.active = 1
 JOIN contact_event ce
     ON ac.contact_id=ce.contact_id AND ce.role = 'Checked In'
 JOIN event e
     ON ce.event_id=e.id
 WHERE e.date_start >= '2015-12-31' AND e.date_end < '2017-01-01'    
 GROUP BY ac.id ) a2

ON a1.id=a2.id

显示问题的示例输出:如您所见,Distinct Events 返回该特定事件向公司出售的门票数量,因此在示例中共有 8 个事件参加,

AccountId   Tickets  DistinctEvents
38110518    15       5
38110518    15       1
38110518    15       3
38110518    15       2 
38110518    15       1
38110518    15       1
38110518    15       1
38110518    15       1

相反,我应该返回:

AccountID   Tickets    DistinctEvents
38110518    15         8

编辑:示例数据

SELECT id,name FROM account;
id  name
100 Big Company


SELECT id,first_name FROM contact;
id  first_name
200 John
800 Other


SELECT contact_id,event_id FROM contact_event;
contact_id  event_id
200 300
200 500
800 300


SELECT account_id,contact_id FROM account_contact;
account_id  contact_id
100 200
100 800


SELECT id,name FROM event;
id   name
300  Big Event
500  Small Event

应该返回:

AccountID   Tickets    DistinctEvents
100         3          2

最佳答案

试试这个:

select
    a.account_id,
    count(event_id) tickets,
    count(distinct event_id) distinct_events
from account_contact a
inner join contact_event e
on a.contact_id = e.contact_id
group by a.account_id;

关于MySQL按两个不同维度分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41832820/

相关文章:

mysql - 获取属于具有两行以上父类别的行

mysql - 其中公司 =(不同公司)

c# - 在另一个查询中使用 SQL 查询结果

mysql - SQL 检查两个表是否具有特定 ID 的相同数据

php - 连接服务器上的 PDO 时发生错误

PHP/SQL 转换时间戳

php - MySQL-FULLTEXT 模式匹配

mysql - 如何在表中实现位数据类型

javascript - 如果在 MySQL 表中找不到数据,如何使用 Ajax 清除文本框并发送警报消息?

php - 将 TinyInt 值更改为 1 PHP