mysql分组统计问题

时间:2021-09-05 09:43:29
表一
CREATE TABLE IF NOT EXISTS `tp_zxyygl` (
  `zxgl_id` int(11) NOT NULL AUTO_INCREMENT,
  `zxgl_lrname` int(10) NOT NULL,
  `zxgl_mj` int(11) NOT NULL,
  `zx_id` int(11) NOT NULL,
  `zxgl_yytime` int(11) NOT NULL,
  `zxgl_lrtime` int(11) NOT NULL,
  `zxgl_name` varchar(10) NOT NULL,
  `zxgl_phone` varchar(20) NOT NULL,
  `zxgl_sex` int(1) NOT NULL,
  `zxgl_age` int(2) NOT NULL,
  `zxgl_zhenh` varchar(40) NOT NULL,
  `zxgl_ksid` int(11) NOT NULL,
  `bz_id` int(11) NOT NULL,
  `zxgl_img` varchar(255) NOT NULL,
  `zxgl_jz_uid` int(11) NOT NULL,
  `zxgl_gjc` varchar(100) NOT NULL,
  `zxgl_bz` varchar(255) NOT NULL,
  `zxgl_status` int(1) NOT NULL,
  `zxgl_doctor` int(1) NOT NULL,
  `zxgl_jzname` varchar(10) NOT NULL,
  `zxgl_dialogue` text NOT NULL,
  `zxgl_jztime` int(11) NOT NULL,
  `zxgl_treatment` int(1) NOT NULL,
  `zxgl_hfjg` varchar(100) NOT NULL,
  `hp_id` int(11) NOT NULL,
  PRIMARY KEY (`zxgl_id`),
  KEY `hp_id` (`hp_id`)



统计语句
select a.hp_id,b.hp_yyname as hp_name,count(case a.zxgl_status when 0 then 1 end) as yy from tp_zxyygl a LEFT JOIN tp_hospitalp b ON a.hp_id=b.hp_id where  IF(a.hp_id=1,a.zxgl_mj<>5,1=1) AND IF(a.hp_id=2,a.zxgl_mj<>5,1=1) AND IF(a.hp_id=3,a.zxgl_mj<>5,1=1) group by a.hp_id
4W来条数据在服务器上面运行需要6秒多点时间
求帮忙看看哪里的问题

10 个解决方案

#1


自己先顶....

#2


没啥问题 这么复杂的条件已经不慢了

#3


引用 2 楼 rucypli 的回复:
没啥问题 这么复杂的条件已经不慢了

有没有可以改进的地方?

#4


重新理清主表与附表的关系。大数据量的表(相对你的数据库),建议少用Left join减少限制地去关联,效率会降低很多(当你的附表数据量也慢慢变大后)。

#5


引用 4 楼 xiebuqing 的回复:
重新理清主表与附表的关系。大数据量的表(相对你的数据库),建议少用Left join减少限制地去关联,效率会降低很多(当你的附表数据量也慢慢变大后)。

那应该用什么去关联比较好呢

#6


引用 5 楼 opaskiss1 的回复:
Quote: 引用 4 楼 xiebuqing 的回复:

重新理清主表与附表的关系。大数据量的表(相对你的数据库),建议少用Left join减少限制地去关联,效率会降低很多(当你的附表数据量也慢慢变大后)。

那应该用什么去关联比较好呢

你关联两个表的字段是对的,但是我觉得你的外键值`hp_id`在关联表时是必要的,所以你可以不用left join的形式去关联表,你尝试用join直接关联,速度应该会提升不少,而且也符合逻辑。试试看吧。

#7


引用 6 楼 xiebuqing 的回复:
Quote: 引用 5 楼 opaskiss1 的回复:

Quote: 引用 4 楼 xiebuqing 的回复:

重新理清主表与附表的关系。大数据量的表(相对你的数据库),建议少用Left join减少限制地去关联,效率会降低很多(当你的附表数据量也慢慢变大后)。

那应该用什么去关联比较好呢

你关联两个表的字段是对的,但是我觉得你的外键值`hp_id`在关联表时是必要的,所以你可以不用left join的形式去关联表,你尝试用join直接关联,速度应该会提升不少,而且也符合逻辑。试试看吧。

不用的话 更慢了

#8


引用 7 楼 opaskiss1 的回复:
Quote: 引用 6 楼 xiebuqing 的回复:

Quote: 引用 5 楼 opaskiss1 的回复:

Quote: 引用 4 楼 xiebuqing 的回复:

重新理清主表与附表的关系。大数据量的表(相对你的数据库),建议少用Left join减少限制地去关联,效率会降低很多(当你的附表数据量也慢慢变大后)。

那应该用什么去关联比较好呢

你关联两个表的字段是对的,但是我觉得你的外键值`hp_id`在关联表时是必要的,所以你可以不用left join的形式去关联表,你尝试用join直接关联,速度应该会提升不少,而且也符合逻辑。试试看吧。

不用的话 更慢了

http://www.cnblogs.com/zping/archive/2008/08/05/1260989.html 可以看看这个文章。当然你的语句执行效率慢或许不是因为left join。但是在连接两个表的思路上,我看了你表设计的关系,认为没必要使用left join,因为你的not null,group by都表示你这个外键值的不可或缺。我们平时写SQL也是尽量避免使用不加限制(或只加一半限制)的连接!

#9


这个SQL确实很慢,如果需要彻底解决这个问题,可以 以牺牲空间来换取时间。
多建一张统计表

#10


引用 9 楼 zyfvcxz 的回复:
这个SQL确实很慢,如果需要彻底解决这个问题,可以 以牺牲空间来换取时间。
多建一张统计表

现在已经解决了 和你说的一样
多建了一个表 把数字全导过去
然后多建立了一个索引 基本0.0几秒就能查出

#1


自己先顶....

#2


没啥问题 这么复杂的条件已经不慢了

#3


引用 2 楼 rucypli 的回复:
没啥问题 这么复杂的条件已经不慢了

有没有可以改进的地方?

#4


重新理清主表与附表的关系。大数据量的表(相对你的数据库),建议少用Left join减少限制地去关联,效率会降低很多(当你的附表数据量也慢慢变大后)。

#5


引用 4 楼 xiebuqing 的回复:
重新理清主表与附表的关系。大数据量的表(相对你的数据库),建议少用Left join减少限制地去关联,效率会降低很多(当你的附表数据量也慢慢变大后)。

那应该用什么去关联比较好呢

#6


引用 5 楼 opaskiss1 的回复:
Quote: 引用 4 楼 xiebuqing 的回复:

重新理清主表与附表的关系。大数据量的表(相对你的数据库),建议少用Left join减少限制地去关联,效率会降低很多(当你的附表数据量也慢慢变大后)。

那应该用什么去关联比较好呢

你关联两个表的字段是对的,但是我觉得你的外键值`hp_id`在关联表时是必要的,所以你可以不用left join的形式去关联表,你尝试用join直接关联,速度应该会提升不少,而且也符合逻辑。试试看吧。

#7


引用 6 楼 xiebuqing 的回复:
Quote: 引用 5 楼 opaskiss1 的回复:

Quote: 引用 4 楼 xiebuqing 的回复:

重新理清主表与附表的关系。大数据量的表(相对你的数据库),建议少用Left join减少限制地去关联,效率会降低很多(当你的附表数据量也慢慢变大后)。

那应该用什么去关联比较好呢

你关联两个表的字段是对的,但是我觉得你的外键值`hp_id`在关联表时是必要的,所以你可以不用left join的形式去关联表,你尝试用join直接关联,速度应该会提升不少,而且也符合逻辑。试试看吧。

不用的话 更慢了

#8


引用 7 楼 opaskiss1 的回复:
Quote: 引用 6 楼 xiebuqing 的回复:

Quote: 引用 5 楼 opaskiss1 的回复:

Quote: 引用 4 楼 xiebuqing 的回复:

重新理清主表与附表的关系。大数据量的表(相对你的数据库),建议少用Left join减少限制地去关联,效率会降低很多(当你的附表数据量也慢慢变大后)。

那应该用什么去关联比较好呢

你关联两个表的字段是对的,但是我觉得你的外键值`hp_id`在关联表时是必要的,所以你可以不用left join的形式去关联表,你尝试用join直接关联,速度应该会提升不少,而且也符合逻辑。试试看吧。

不用的话 更慢了

http://www.cnblogs.com/zping/archive/2008/08/05/1260989.html 可以看看这个文章。当然你的语句执行效率慢或许不是因为left join。但是在连接两个表的思路上,我看了你表设计的关系,认为没必要使用left join,因为你的not null,group by都表示你这个外键值的不可或缺。我们平时写SQL也是尽量避免使用不加限制(或只加一半限制)的连接!

#9


这个SQL确实很慢,如果需要彻底解决这个问题,可以 以牺牲空间来换取时间。
多建一张统计表

#10


引用 9 楼 zyfvcxz 的回复:
这个SQL确实很慢,如果需要彻底解决这个问题,可以 以牺牲空间来换取时间。
多建一张统计表

现在已经解决了 和你说的一样
多建了一个表 把数字全导过去
然后多建立了一个索引 基本0.0几秒就能查出