已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 编程 > 数据库

标题: 这个sql总感觉哪里不对

作者: @Ta

时间: 2022-09-16

点击: 7792

SELECT user.id,
user.nick,
sum(uid.state=0) as lnums 
from user,uid
where
user.password is not null 
and
uid.user=user.id
GROUP BY user.id

因为查询时长为0.7s,感觉不太对劲


[隐藏样式|查看源码]


『回复列表(25|隐藏机器人聊天)』

1.

uid表是啥。。

(/@Ta/2022-09-16 19:06//)

2.

没啥不对的吧,全表扫描所以慢

(/@Ta/2022-09-16 19:12//)

3.

@老虎会游泳,请教下有没有优化的可能,没有的话只能用ajax加载了,否则会拖慢网页打开速度

(/@Ta/2022-09-17 13:18//)

4.

@echo醉老仙,你可以给出两个表的数据示例,以及你查询的目的吗?

(/@Ta/2022-09-17 15:58//)

5.

@老虎会游泳,第一张表就是用户表,id , nick , passwd 第二张表是数据表,id , uid , user , state
是想查出指定用户的数据数量,state=0的

(/@Ta/2022-09-17 18:31//)

6.

@echo醉老仙,所以为嘛不能 user(id, nick, passwd, state) 呢?

然后就可以这样了:

SELECT count(*)
  FROM user
 WHERE state = 0
(/@Ta/2022-09-17 19:30//)

7.

@无名啊,因为state在表2:uid

(/@Ta/2022-09-17 19:37//)

8.

@echo醉老仙,你给点数据示例吧,还不知道你这些字段干啥的。。

(/@Ta/2022-09-17 19:38//)

9.

@echo醉老仙,先去掉sum(uid.state=0) as lnums,然后把现在的sql当成子查询,放到主查询语句的from后边并as别名i,最后主查询语句大概是这样的select i.*,sum(i.state=0) as lnums from (上面说的子查询语句),你执行看看效率!

(/@Ta/2022-09-18 13:00//)

11.

@TabKey9,优化后查询时间为0.24s,比较符合预期

select user.id,
user.nick,
sum(i.user=user.id) as lnums 
from user,(SELECT user,state from uid where state=0 ) as i 
where user.password is not null
GROUP BY user.id
(/@Ta/2022-09-18 13:30//)

12.

@TabKey9,但是在tp里不知道什么毛病,需要2s多
image.png(8.31 KB)
image.png(9.91 KB)
image.png(8.25 KB)

(/@Ta/2022-09-18 15:36//)

13.

@echo醉老仙,能说说你 uid 数据表里各个字段的作用不?

(/@Ta/2022-09-18 15:51//)

14.

@无名啊,没什么作用,随意填充都可以,理解成帖子这种数据都行,比如:查询每个用户的已过审的帖子总数

(/@Ta/2022-09-18 16:09//)

15.

@echo醉老仙id, uid, user 这几个字段是干啥的?

  • id:自增序列?
  • uid:user_id?
  • user:外键,对应 user 表的自增序列?
(/@Ta/2022-09-18 16:14//)

16.
(/@Ta/2022-09-18 17:03//)

17.

@echo醉老仙uid表的user字段,是userid的外键嘛?

如果是,这样?

SELECT u.id, u.nick, count(*)
  FROM uid
  JOIN user u ON u.id = uid.user
 WHERE uid.state = 0
   AND u.password IS NOT NULL
 GROUP BY uid.user

或者,这样?

SELECT u.id, u.nick, t.cnt
  FROM (SELECT user, count(*) cnt
          FROM uid
         WHERE state = 0
         GROUP BY user) t
  JOIN user u ON u.id = t.user
 WHERE u.password IS NOT NULL

你测测哪个速度快些

(/@Ta/2022-09-18 17:37//)

18.

@无名啊,我需要所有用户的数量,即使uid表中不存在他的数据,因此11楼目前得到的结果是最符合的,但放在tp里就执行就需要2s多

类似这样的结果
image.png(7.21 KB)

(/@Ta/2022-09-18 17:45//)

19.

@echo醉老仙user表中,password IS NULL 的用户,需要出现在结果中吗?

(/@Ta/2022-09-18 17:48//)

20.

@无名啊,对,就是要找密码为空的用户

(/@Ta/2022-09-18 17:58//)

下一页 1/2页,共25楼

回复需要登录

8月1日 12:34 星期五

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1