我有三个不同的表,Product
有不同的列和结构,假设
产品1 ,产品2 ,产品3
所以,我试图获得具有相同user_id
的三个表的计数(*),即foreach user_id字段。
表格 - 产品1
select P.user_id, count(*)
from Product1 P
group by P.user_id
表格 - 产品2
select P.user_id, count(*)
from Product2 P
group by P.user_id
表格 - 产品3
select P.user_id, count(*)
from Product3 P
group by P.user_id
他们向我user_id
字段和count(*)
,
我可以添加count(*),foreach user_id 字段的结果吗?提前谢谢
答案 0 :(得分:3)
有三个具有相同结构的表通常表明数据库设计不佳。您应该找出将表合并到一个表中的方法。
无论如何,您可以汇总结果。一种方法是:
select user_id, sum(cnt)
from ((select user_id, count(*) as cnt
from product1
group by user_id
) union all
(select user_id, count(*) as cnt
from product2
group by user_id
) union all
(select user_id, count(*) as cnt
from product3
group by user_id
)
) up
group by user_id;
您希望使用union all
而不是join
,因为MySQL不支持full outer join
。 Union all
确保包含所有三个表中的用户。
聚合两次(在子查询和外部查询中)允许MySQL使用内部聚合的索引。这可能是一种性能优势。
此外,如果要查找特定用户或一组用户,请在子查询中使用where
子句。这比在子查询中将所有数据放在一起然后进行过滤更有效(在MySQL中)。
答案 1 :(得分:2)
使用UNION
合并结果,然后进行添加。
<强>查询强>
select t.`user_id`, sum(`count`) as `total` from(
select `user_id`, count(*) as `count`
from `Product1`
group by `user_id`
union all
select `user_id`, count(*)
from `Product2`
group by `user_id`
union all
select `user_id`, count(*)
from `Product3`
group by `user_id`
) t
group by t.`user_id`;
答案 2 :(得分:2)
你可以总结所有
的结果select user_id, sum(my_count)
from (
select P.user_id, count(*) my_count
from Product1 P
group by P.user_id
UNION ALL
select P.user_id, count(*)
from Product2 P
group by P.user_id
UNION ALL
select P.user_id, count(*)
from Product3 P
group by P.user_id ) t
group by user_id
答案 3 :(得分:2)
是的,你可以:)
SELECT SUM(userProducts) userProducts
FROM (
SELECT count(user_id) userProducts FROM Product1 WHERE user_id = your_user_id
UNION ALL
SELECT count(user_id) userProducts FROM Product2 WHERE user_id = your_user_id
UNION ALL
SELECT count(user_id) userProducts FROM Product3 WHERE user_id = your_user_id
) s
答案 4 :(得分:0)
请在下面尝试。没有尝试在db中,因此可能会出现语法错误。
选择p.user_id,sum(total)from( 选择P.user_id,通过P.user_id计算product1 p组的总计() 联合所有 选择P.user_id,通过P.user_id从product2 p组计算()总计 联合所有 选择P.user_id,通过P.user_id从product3 p group计算总数(*) )a
答案 5 :(得分:0)
是的,我们可以根据我们的要求,使用tables
和join
汇总来自不同union
的结果。在您的情况下,Union All将完美地工作,并且可以使用count(1)
而不是count(*)
来编写优化查询,因为它使用table
的第一个索引,它通常是聚集索引。
select user_id, sum(cnt)
from ((select user_id, count(1) as cnt
from product1
group by user_id
) union all
(select user_id, count(1) as cnt
from product2
group by user_id
) union all
(select user_id, count(1) as cnt
from product3
group by user_id
)
) a
group by user_id;