0

我有以下 SQL 代码,这是来自 MySQL 数据库。现在它给了我期望的结果,但是查询很慢,我认为我应该在继续之前加快这个查询。

表 agentstatusinformation 有:

PKEY(主键)、userid(整数)、agentstate(整数)

表 axpuser 包含用户名:

PKEY (Primary Key) <-- 这是 userid, loginid (usersname) 的键

select distinct (select loginid from axpuser where axpuser.pkey = age.userid),
   case
        when agentstate = 1 then 'Ready'
        when agentstate = 3 then 'Pause'
   end as state
from   agentstatusinformation age
where  (userid, pkey) in 
 (select userid, max(pkey) from agentstatusinformation group by userid)

我相信这可以改进,但我看不到树木的木材。

非常感谢。

4

3 回答 3

2

不能完全确定这是你想要的,但我认为它很接近:

Select loginid, case when c.agentstate=1 Then 'Ready' 
                     when c.agentstate=3 then 'Pause' 
                end state
  from axpuser a
  join (select userid, max(pkey) pkey
          from agentstatusinformation 
          group by userid ) b 
     on a.userid=b.userid
   join agentstatusinformation c
    and b.pkey=c.pkey

这消除了初始 SELECT 子句中的子选择,并连接到分组的统计信息表。希望这可以帮助。

于 2012-09-13T15:08:29.017 回答
1

您的查询的问题是您的嵌套选择。特别是 IN 子句中的子查询在 MySQL 中是有问题的。它被 where 子句过滤的每一行调用。

以下解决了这个问题:

select distinct (select loginid from axpuser where axpuser.pkey = age.userid),
   case
        when agentstate = 1 then 'Ready'
        when agentstate = 3 then 'Pause'
   end as state
from   agentstatusinformation age
where exists (select userid, max(pkey)
              from agentstatusinformation a2
              where a2.userid = age.userid
              group by userid
              having age.pkey = max(pkey))

您可以通过在 agenstatusinfromation(userid, pkey) 上创建索引来加快运行速度。

只要 axpuser.pkey 上有索引,嵌套选择就不会造成问题。但是,我认为将其作为连接放在 FROM 子句中是更好的形式:

select distinct axpuser.loginid,
   case
        when agentstate = 1 then 'Ready'
        when agentstate = 3 then 'Pause'
   end as state
from   agentstatusinformation age left outer join
       axpuser
       on axpuser.key = age.userid
where exists (select userid, max(pkey)
              from agentstatusinformation a2
              where a2.userid = age.userid
              group by userid
              having age.pkey = max(pkey)
             )
于 2012-09-13T15:46:23.010 回答
0
 select ax.loginid,
        case
        when age.agentstate = 1 then 'Ready'
        when age.agentstate = 3 then 'Pause'
        end as state 
from 
 agentstatusinformation age
 join 
 axpuser ax
 on age.userid = ax.userid and age.pkey=(select max(pkey) from agentstatusinformation group by userid)
于 2012-09-13T15:05:08.580 回答