首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sql联合和分组依据

问Sql联合和分组依据
EN

Stack Overflow用户
提问于 2019-05-04 18:42:32
回答 1查看 37关注 0票数 0

我有一个问题:

代码语言:javascript
复制
SELECT users.name, 
COUNT(DISTINCT leads.id) as leads,
COUNT(DISTINCT properties.id) as properties,
COUNT(DISTINCT buyers.id) as buyers,
null
FROM users
LEFT JOIN (SELECT * from leads WHERE date(created_at) BETWEEN '2019-04-13' AND'2019-04-13') leads ON users.id = leads.user_id
LEFT JOIN (SELECT * from properties WHERE date(contract_start_date) BETWEEN '2019-04-13' AND'2019-04-13') as properties ON users.id = properties.user_id
LEFT JOIN (SELECT * from buyers WHERE date(created_at) BETWEEN '2019-04-13' AND'2019-04-13') as buyers ON users.id = buyers.user_id
LEFT JOIN buyer_searches ON buyers.id = buyer_searches.buyer_id
GROUP BY users.id
UNION
SELECT users.name,
null, null, null,
COUNT(DISTINCT buyer_searches.id) as buyer_searches
FROM users
LEFT JOIN buyers ON users.id = buyers.user_id
LEFT JOIN (SELECT * from buyer_searches WHERE date(created_at) BETWEEN '2019-04-08' AND'2019-04-13') as buyer_searches ON buyers.id = buyer_searches.buyer_id
GROUP BY users.id

当然,我得到了一个包含重复用户的表,但参数正确:

代码语言:javascript
复制
users field1 field2 field3 etc....
user1 data . null . null etc...
user2 data . null . null etc...
user1 null . data . data etc...
user2 null . data .data etc...
etc...

我想按用户连接这些行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-04 18:46:39

在SELECT中使用子查询执行以下操作:

代码语言:javascript
复制
SELECT u.name, 
       (SELECT COUNT(*)
        FROM leads l
        WHERE l.user_id = u.id AND
              l.created_at >= '2019-04-13' AND
              l.created_at < '2019-04-14'
       ) as num_leads,
       (SELECT COUNT(*)
        FROM properties p
        WHERE p.user_id = u.id AND
              p.created_at >= '2019-04-13' AND
              p.created_at < '2019-04-14'
       ) as num_buyers,
       (SELECT COUNT(*)
        FROM buyers b
        WHERE b.user_id = u.id AND
              b.created_at >= '2019-04-13' AND
              b.created_at < '2019-04-14'
       ) as num_buyers,
       (SELECT COUNT(*)
        FROM buyers b JOIN
             buyer_searches bs
             ON b2.buyer_id = b.id AND
        WHERE b.user_id = u.id AND
              bs.created_at >= '2019-04-13' AND
              bs.created_at < '2019-04-14'
       ) as num_buyer_searches
FROM users u;

通过将这些表JOIN在一起,您正在为每个用户创建一个(潜在的)巨大的笛卡尔产品。然后对此进行筛选,以计算不同的ids。直接对它们进行计数效率更高。

每个用户都应该有一行。

请注意,我已经更改了日期比较。列上的函数几乎总是排除了索引的使用。这个版本的查询可以利用表上的索引--比如leads(user_id, created_at) --如果它们可用的话。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55981703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档