又来求助mysql问题了,关于left join,右表数据多造成count数量不是想要的,但是业务原因,group已经用掉了

再看我一眼 2015-06-25 10:03:46
如题

大致的SQL语句是这样的


SELECT
FROM_UNIXTIME(a.submit_time, '%c') AS day_str,
SUM(
CASE
WHEN (
l.state IN (2, 4, 6, 8)
AND l.time BETWEEN 1420041601
AND 1451577599
) THEN
100
ELSE
0
END
) AS patch_Num,
COUNT(a.id)
FROM
a
LEFT JOIN i ON a.i_id = i.id
LEFT JOIN p ON i.city_id = p.id
LEFT JOIN l ON a.id = l.a_id
WHERE
a.submit_time BETWEEN 1420041601
AND 1451577599
GROUP BY
FROM_UNIXTIME(a.submit_time, '%Y-%m')


l表是log表,a表的一条数据在l表中有多条记录,现在要取出l表中state有过2 4 6 8 的a的数量(由于每个state只出现一次并且互斥,因此可以直接统计是2/4/6/8的数量),以及a的总记录数,现在统计a的记录总数会统计成l的记录总数,求教一条sql如何实现 感谢
...全文
1985 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdnbbxdl 2015-07-07
  • 打赏
  • 举报
回复
LEFT JOIN (SELECT COUNT(1) CNT, ID FROM P GROUP BY ID) 这样应该可以
LongRui888 2015-07-06
  • 打赏
  • 举报
回复
如果a.id是主键,是否可以 COUNT(distinct a.id)
LongRui888 2015-07-06
  • 打赏
  • 举报
回复
引用 2 楼 anyilaoliu 的回复:
[quote=引用 1 楼 fdipzone 的回复:] 没有表结构吗?

select count(*) from a where a.id in(select i.aid from i where state in(2,4,6,8) and i.aid=a.id);
其实简化下需求是这样的 左表left join右表 同时要在一定条件下统计左表记录数和右表记录数 您这样的写法其实只统计了左表记录数 再帮我看看吧 谢谢 [/quote] 这2个是一定要的吗: LEFT JOIN i ON a.i_id = i.id LEFT JOIN p ON i.city_id = p.id
xuzuning 2015-06-26
  • 打赏
  • 举报
回复
既无表结构,也无测试数据,简化从何谈起 你使用了左连接,右表簇一般都会有冗余出现 而你的分组键是右表的计算列,出问题就很正常了(不出问题是你的运气) 你应该将分组键所在的表调整到主表地位
再看我一眼 2015-06-26
  • 打赏
  • 举报
回复
引用 1 楼 fdipzone 的回复:
没有表结构吗?

select count(*) from a where a.id in(select i.aid from i where state in(2,4,6,8) and i.aid=a.id);
其实简化下需求是这样的 左表left join右表 同时要在一定条件下统计左表记录数和右表记录数 您这样的写法其实只统计了左表记录数 再帮我看看吧 谢谢
傲雪星枫 2015-06-25
  • 打赏
  • 举报
回复
没有表结构吗?

select count(*) from a where a.id in(select i.aid from i where state in(2,4,6,8) and i.aid=a.id);

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧