mysql多表多条件查询问题

qq_35970356 2016-08-26 10:48:46
表1:RYID 姓名
1 张三
2 李四
3 王五

表2:定性
一般
严重
规范
建议

表3:RYID 定性
1 一般
1 一般
1 规范
3 一般
3 规范
3 规范

希望显示的查询统计结果
姓名 一般 严重 规范 建议
张三 2 0 1 0
李四 0 0 0 0
王五 1 0 2 0

表1和表3的RYID是同一字段。
要根据表1.RYID,及表2.定性,统计表1.RYID+表2.定性=表3.RYID+表3.定性的数量。
如果表1.RYID+表2.定性在表面中没有查询结果则显示0.表1.RYID+表2.定性是笛卡尔积。
查询结果根据表1.RYID要显示姓名而不是RYID.
如何构建查询统计语句,谢谢
...全文
344 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_35970356 2016-08-29
  • 打赏
  • 举报
回复
最终查询语句是这样的 select distinct zhm,一般违规,严重违规,规范,建议 from user left join (select zhh,sum(if(wtdx='一般违规',1,0)) as 一般违规,sum(if(wtdx='严重违规',1,0)) as 严重违规,sum(if(wtdx='规范',1,0)) as 规范,sum(if(wtdx='建议',1,0)) as 建议 from wtqd group by zhh) b on user.zhh = b.zhh
qq_35970356 2016-08-29
  • 打赏
  • 举报
回复
终于搞定了 非常感谢楼上两位老师的指导,谢谢!!
qq_35970356 2016-08-29
  • 打赏
  • 举报
回复
引用 14 楼 hdcopy2001 的回复:
无语了
查出来的结果是这样的。 ifnull('一般违规',0) ifnull('严重违规',0) ifnull('规范',0) ifnull('建议',0) 桓台支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 桓台支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 桓台支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 桓台支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 齐鲁石化支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 齐鲁石化支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 齐鲁石化支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 齐鲁石化支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 齐鲁石化支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 齐鲁石化支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 齐鲁石化支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 齐鲁石化支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 齐鲁石化支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 齐鲁石化支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 齐鲁石化支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 齐鲁石化支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 齐鲁石化支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 齐鲁石化支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 淄博博山支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 淄博博山支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 淄博博山支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 淄博博山支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 淄博博山支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 淄博博山支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 淄博高青支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 淄博高青支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 淄博高新技术产业开发区支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 淄博高新技术产业开发区支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 淄博高新技术产业开发区支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae 淄博高新技术产业开发区支行 e4b880e888ace8bf9de8a784 e4b8a5e9878de8bf9de8a784 e8a784e88c83 e5bbbae8aeae
qq_35970356 2016-08-26
  • 打赏
  • 举报
回复
引用 2 楼 zjcxc 的回复:
SELECT 姓名
	,sum(if(定性='一般',1,0)) as 一般
	,sum(if(定性='严重',1,0)) as 严重
	,sum(if(定性='规范',1,0)) as 规范
	,sum(if(定性='建议',1,0)) as 建议
from 表1, 表3
where 表1.YID=表3.RYID
group by 姓名
不好意思,刚才看错了,姓名没有问题不用指定表名。但还存在两个问题: 一、统计数量大于实际数量 二、不能显示查询统计数量为0的行,比如王五各项均为0,但查询结果不显示
qq_35970356 2016-08-26
  • 打赏
  • 举报
回复
引用 2 楼 zjcxc 的回复:
SELECT 姓名
	,sum(if(定性='一般',1,0)) as 一般
	,sum(if(定性='严重',1,0)) as 严重
	,sum(if(定性='规范',1,0)) as 规范
	,sum(if(定性='建议',1,0)) as 建议
from 表1, 表3
where 表1.YID=表3.RYID
group by 姓名
谢谢回复,转置确实实现了,但姓名列未指明 表名,用表1.姓名,统计出的结果有误,大于实际数量
hdcopy2001 2016-08-26
  • 打赏
  • 举报
回复
自行百度 mysql 行列转置
zjcxc 2016-08-26
  • 打赏
  • 举报
回复
如果定性不是确定值,那么只能写存储过程拼查询语句了
zjcxc 2016-08-26
  • 打赏
  • 举报
回复
SELECT 姓名
	,sum(if(定性='一般',1,0)) as 一般
	,sum(if(定性='严重',1,0)) as 严重
	,sum(if(定性='规范',1,0)) as 规范
	,sum(if(定性='建议',1,0)) as 建议
from 表1, 表3
where 表1.YID=表3.RYID
group by 姓名
致命的西瓜 2016-08-26
  • 打赏
  • 举报
回复
建议贴出表结构 方便做测试
hdcopy2001 2016-08-26
  • 打赏
  • 举报
回复


无语了
qq_35970356 2016-08-26
  • 打赏
  • 举报
回复
引用 12 楼 zjcxc 的回复:
不唯一自然会重复统计,这个你只能自己改,重复数据的过滤规则是你自己决定 的 你可以有子查询,先把数据整理好,然后再在外面套 GORUP BY 做汇总
过滤规则就是想把表1仅保留不重复数据,所以才用了distinct user.zhh 但没起效果,代码确实不会了,还麻烦给出代码,谢谢
zjcxc 2016-08-26
  • 打赏
  • 举报
回复
不唯一自然会重复统计,这个你只能自己改,重复数据的过滤规则是你自己决定 的 你可以有子查询,先把数据整理好,然后再在外面套 GORUP BY 做汇总
qq_35970356 2016-08-26
  • 打赏
  • 举报
回复
引用 8 楼 zjcxc 的回复:
姓名有重复? 或者 YID 不唯一?
表一和表三的姓名及ryid 都不是唯一的 这一例是级联的第二级,第三次才是不重复的
qq_35970356 2016-08-26
  • 打赏
  • 举报
回复
表一和表三的姓名及ryid 都不是唯一的
hdcopy2001 2016-08-26
  • 打赏
  • 举报
回复
SELECT ryid
    ,sum(if(wtdx='一般',1,0)) as 一般
    ,sum(if(wtdx='严重',1,0)) as 严重
    ,sum(if(wtdx='规范',1,0)) as 规范
    ,sum(if(wtdx='建议',1,0)) as 建议
from 表3
group by ryid
select 姓名,b.* from 表1 a left join (SELECT ryid ,sum(if(wtdx='一般',1,0)) as 一般 ,sum(if(wtdx='严重',1,0)) as 严重 ,sum(if(wtdx='规范',1,0)) as 规范 ,sum(if(wtdx='建议',1,0)) as 建议 from 表3 group by ryid) b on a.ryid = b.ryid 无记录的是null,自己用ifnull处理,懒得打了。
zjcxc 2016-08-26
  • 打赏
  • 举报
回复
姓名有重复? 或者 YID 不唯一?
qq_35970356 2016-08-26
  • 打赏
  • 举报
回复
SELECT distinct user.zhh,sum(if(wtdx='一般违规',1,0)) as 一般违规 ,sum(if(wtdx='严重违规',1,0)) as 严重违规 ,sum(if(wtdx='规范',1,0)) as 规范 ,sum(if(wtdx='建议',1,0)) as 建议 from user left join wtqd on user.zhh=wtqd.zhh group by user.zhh 用LEFT JOIN解决了无记录显示0的问题,但还是统计不正确

56,687

社区成员

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

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