字段记录去重的问题

angrymouse 2015-06-11 09:14:29
SQL语句如下:

SELECT
COUNT(distinct log.time_id) as logcount,
SUM(case when admit.admit_opinion='优' then 1 else 0 end) as best,
SUM(case when admit.admit_opinion='良' then 1 else 0 end) as good,
SUM(case when admit.admit_opinion='中' then 1 else 0 end) as middle,members.username
FROM members
LEFT JOIN userclass ON members.flag=userclass.flagid
LEFT JOIN log ON members.uid=log.userid
LEFT JOIN log_time ON log.time_id=log_time.tid
LEFT JOIN admit ON log.id=admit.logid
WHERE userclass.iswrite=1 AND log_time.end_date < curdate() AND log_time.year=".$year."
GROUP BY members.uid,admit.admit_flag
ORDER BY members.groupid,members.flag DESC,members.uid

现在的问题是admit表中有很多记录的logid是重复的(其它字段数据不同,只有logid相同),我只想统计出logid不同的记录数,也就是同样的logid只统计一次,然后用sum汇总出优、良、中来。这个语句怎么改?
...全文
187 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
angrymouse 2015-06-15
  • 打赏
  • 举报
回复
引用 13 楼 angrymouse 的回复:
[quote=引用 12 楼 xiaoxiao081228 的回复:] [quote=引用 11 楼 angrymouse 的回复:] [quote=引用 10 楼 xiaoxiao081228 的回复:]
select pk from table group by logId
这样就去除重复的logId了啊
你指的是group by 去重是吧? 可是到我sql语句里就去不了重[/quote] 直接写这么一句sql都没效果,那就没办法了[/quote] 直接写group by 倒是起作用,可是用到我的语句里不能汇总,会一条一条记录全列出来,不是我要的效果
angrymouse 2015-06-15
  • 打赏
  • 举报
回复
引用 12 楼 xiaoxiao081228 的回复:
[quote=引用 11 楼 angrymouse 的回复:] [quote=引用 10 楼 xiaoxiao081228 的回复:]
select pk from table group by logId
这样就去除重复的logId了啊
你指的是group by 去重是吧? 可是到我sql语句里就去不了重[/quote] 直接写这么一句sql都没效果,那就没办法了[/quote] 是单独写这句起作用,但是用到了我的SQL里就不起作用了,不知道什么干扰的
小小summer 2015-06-15
  • 打赏
  • 举报
回复
引用 14 楼 angrymouse 的回复:
[quote=引用 13 楼 angrymouse 的回复:] [quote=引用 12 楼 xiaoxiao081228 的回复:] [quote=引用 11 楼 angrymouse 的回复:] [quote=引用 10 楼 xiaoxiao081228 的回复:]
select pk from table group by logId
这样就去除重复的logId了啊
你指的是group by 去重是吧? 可是到我sql语句里就去不了重[/quote] 直接写这么一句sql都没效果,那就没办法了[/quote] 直接写group by 倒是起作用,可是用到我的语句里不能汇总,会一条一条记录全列出来,不是我要的效果[/quote] 既然单独有用,那么就
select *from table where pk in (select pk from table group by logId)
这样查出来的肯定就不会重复了
angrymouse 2015-06-12
  • 打赏
  • 举报
回复
引用 8 楼 xiaoxiao081228 的回复:
[quote=引用 5 楼 angrymouse 的回复:] [quote=引用 3 楼 xiaoxiao081228 的回复:] [quote=引用 2 楼 angrymouse 的回复:] [quote=引用 1 楼 xiaoxiao081228 的回复:]

select * from table a where exists(
select pk from
(select pk from table group by logId) b where a.pk = b.pk  ) 
pk是主键
你的意思是不用left join,那我sum在哪里写?[/quote] 括号里面的操作是去除logid重复的,剩下的统计操作在最外层的查询那写就好了[/quote] 我改了一下,可是结果没变啊,有什么不对的吗? SELECT COUNT(distinct log.time_id) as logcount, SUM(case when admit.admit_opinion='优' then 1 else 0 end) as best, SUM(case when admit.admit_opinion='良' then 1 else 0 end) as good, SUM(case when admit.admit_opinion='中' then 1 else 0 end) as middle,members.username FROM members LEFT JOIN userclass ON members.flag=userclass.flagid LEFT JOIN log ON members.uid=log.userid LEFT JOIN log_time ON log.time_id=log_time.tid LEFT JOIN admit ON log.id=admit.logid WHERE EXISTS(select logid from (select logid from admit group by logid) b where b.logid=log.id) AND userclass.iswrite=1 AND log_time.end_date < curdate() AND log_time.year=".$year." GROUP BY members.uid,admit.admit_flag ORDER BY members.groupid,members.flag DESC,members.uid[/quote] 一步一步的走吧,先看看去重部分是否有效,再做统计[/quote] 怎么走?关键是不能去重,麻烦你再给我说的详细点
小小summer 2015-06-12
  • 打赏
  • 举报
回复
引用 5 楼 angrymouse 的回复:
[quote=引用 3 楼 xiaoxiao081228 的回复:] [quote=引用 2 楼 angrymouse 的回复:] [quote=引用 1 楼 xiaoxiao081228 的回复:]

select * from table a where exists(
select pk from
(select pk from table group by logId) b where a.pk = b.pk  ) 
pk是主键
你的意思是不用left join,那我sum在哪里写?[/quote] 括号里面的操作是去除logid重复的,剩下的统计操作在最外层的查询那写就好了[/quote] 我改了一下,可是结果没变啊,有什么不对的吗? SELECT COUNT(distinct log.time_id) as logcount, SUM(case when admit.admit_opinion='优' then 1 else 0 end) as best, SUM(case when admit.admit_opinion='良' then 1 else 0 end) as good, SUM(case when admit.admit_opinion='中' then 1 else 0 end) as middle,members.username FROM members LEFT JOIN userclass ON members.flag=userclass.flagid LEFT JOIN log ON members.uid=log.userid LEFT JOIN log_time ON log.time_id=log_time.tid LEFT JOIN admit ON log.id=admit.logid WHERE EXISTS(select logid from (select logid from admit group by logid) b where b.logid=log.id) AND userclass.iswrite=1 AND log_time.end_date < curdate() AND log_time.year=".$year." GROUP BY members.uid,admit.admit_flag ORDER BY members.groupid,members.flag DESC,members.uid[/quote] 一步一步的走吧,先看看去重部分是否有效,再做统计
angrymouse 2015-06-12
  • 打赏
  • 举报
回复
引用 6 楼 u010198383 的回复:
对admit表进行去重,你看看行不行 SELECT COUNT(distinct log.time_id) as logcount, SUM(case when admit.admit_opinion='优' then 1 else 0 end) as best, SUM(case when admit.admit_opinion='良' then 1 else 0 end) as good, SUM(case when admit.admit_opinion='中' then 1 else 0 end) as middle,members.username FROM members LEFT JOIN userclass ON members.flag=userclass.flagid LEFT JOIN log ON members.uid=log.userid LEFT JOIN log_time ON log.time_id=log_time.tid LEFT JOIN (select logid from admit GROUP BY logid ) dis ON log.id=dis.logid WHERE userclass.iswrite=1 AND log_time.end_date < curdate() AND log_time.year=".$year." GROUP BY members.uid,admit.admit_flag ORDER BY members.groupid,members.flag DESC,members.uid
不行,不能识别SUM中的admit.admit_opinion字段
小小summer 2015-06-12
  • 打赏
  • 举报
回复
引用 11 楼 angrymouse 的回复:
[quote=引用 10 楼 xiaoxiao081228 的回复:]
select pk from table group by logId
这样就去除重复的logId了啊
你指的是group by 去重是吧? 可是到我sql语句里就去不了重[/quote] 直接写这么一句sql都没效果,那就没办法了
angrymouse 2015-06-12
  • 打赏
  • 举报
回复
引用 10 楼 xiaoxiao081228 的回复:
select pk from table group by logId
这样就去除重复的logId了啊
你指的是group by 去重是吧? 可是到我sql语句里就去不了重
小小summer 2015-06-12
  • 打赏
  • 举报
回复
select pk from table group by logId
这样就去除重复的logId了啊
wwwwb 2015-06-11
  • 打赏
  • 举报
回复
先对admit处理,去掉重复的记录,再连接
小小summer 2015-06-11
  • 打赏
  • 举报
回复
引用 2 楼 angrymouse 的回复:
[quote=引用 1 楼 xiaoxiao081228 的回复:]

select * from table a where exists(
select pk from
(select pk from table group by logId) b where a.pk = b.pk  ) 
pk是主键
你的意思是不用left join,那我sum在哪里写?[/quote] 括号里面的操作是去除logid重复的,剩下的统计操作在最外层的查询那写就好了
angrymouse 2015-06-11
  • 打赏
  • 举报
回复
引用 1 楼 xiaoxiao081228 的回复:

select * from table a where exists(
select pk from
(select pk from table group by logId) b where a.pk = b.pk  ) 
pk是主键
你的意思是不用left join,那我sum在哪里写?
小小summer 2015-06-11
  • 打赏
  • 举报
回复

select * from table a where exists(
select pk from
(select pk from table group by logId) b where a.pk = b.pk  ) 
pk是主键
庐州java菜鸟 2015-06-11
  • 打赏
  • 举报
回复
对admit表进行去重,你看看行不行 SELECT COUNT(distinct log.time_id) as logcount, SUM(case when admit.admit_opinion='优' then 1 else 0 end) as best, SUM(case when admit.admit_opinion='良' then 1 else 0 end) as good, SUM(case when admit.admit_opinion='中' then 1 else 0 end) as middle,members.username FROM members LEFT JOIN userclass ON members.flag=userclass.flagid LEFT JOIN log ON members.uid=log.userid LEFT JOIN log_time ON log.time_id=log_time.tid LEFT JOIN (select logid from admit GROUP BY logid ) dis ON log.id=dis.logid WHERE userclass.iswrite=1 AND log_time.end_date < curdate() AND log_time.year=".$year." GROUP BY members.uid,admit.admit_flag ORDER BY members.groupid,members.flag DESC,members.uid
angrymouse 2015-06-11
  • 打赏
  • 举报
回复
引用 3 楼 xiaoxiao081228 的回复:
[quote=引用 2 楼 angrymouse 的回复:] [quote=引用 1 楼 xiaoxiao081228 的回复:]

select * from table a where exists(
select pk from
(select pk from table group by logId) b where a.pk = b.pk  ) 
pk是主键
你的意思是不用left join,那我sum在哪里写?[/quote] 括号里面的操作是去除logid重复的,剩下的统计操作在最外层的查询那写就好了[/quote] 我改了一下,可是结果没变啊,有什么不对的吗? SELECT COUNT(distinct log.time_id) as logcount, SUM(case when admit.admit_opinion='优' then 1 else 0 end) as best, SUM(case when admit.admit_opinion='良' then 1 else 0 end) as good, SUM(case when admit.admit_opinion='中' then 1 else 0 end) as middle,members.username FROM members LEFT JOIN userclass ON members.flag=userclass.flagid LEFT JOIN log ON members.uid=log.userid LEFT JOIN log_time ON log.time_id=log_time.tid LEFT JOIN admit ON log.id=admit.logid WHERE EXISTS(select logid from (select logid from admit group by logid) b where b.logid=log.id) AND userclass.iswrite=1 AND log_time.end_date < curdate() AND log_time.year=".$year." GROUP BY members.uid,admit.admit_flag ORDER BY members.groupid,members.flag DESC,members.uid

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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