这个sql总感觉哪里不对

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,感觉不太对劲

回复列表(26)
  • @Ta / 09-16 19:06 / /

    uid表是啥。。

  • @Ta / 09-16 19:12 / /

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

  • @Ta / 09-17 13:18 / /

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

  • @Ta / 09-17 15:58 / /

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

  • @Ta / 09-17 18:31 / /

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

  • @Ta / 09-17 19:30 / /

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

    然后就可以这样了:

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

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

  • @Ta / 09-17 19:38 / /

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

  • @Ta / 09-18 13:00 / /

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

  • @Ta / 09-18 12:42 / /
    被锁定
    层主 @TabKey9 于 2022-09-18 13:00 删除了该楼层。
  • @Ta / 09-18 13:30 / /

    @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 / 09-18 15:36 / /

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

  • @Ta / 09-18 15:51 / /

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

  • @Ta / 09-18 16:09 / /

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

  • @Ta / 09-18 16:14 / /

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

    • id:自增序列?
    • uid:user_id?
    • user:外键,对应 user 表的自增序列?
  • @Ta / 09-18 17:03 / /
  • @Ta / 09-18 17:37 / /

    @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 / 09-18 17:45 / /

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

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

  • @Ta / 09-18 17:48 / /

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

添加新回复
回复需要登录