我在mysql里面执行这个sql语句总是当机,高手来救命啊~SELECT b.AccountId,d.Description,d.Meaning,c.LevelCode,c.Value FROM PrismaLog a INNER JOIN PrismaLog b ON a.AccountId=b.AccountId AND ON a.Date=b.Date AND ON a.ServerId=b.ServerId INNER JOIN LogValue c ON b.LogId=c.LogId INNER JOIN LogMap d ON c.LevelCode=d.LevelCode WHERE a.ServerId='sip13379' AND (TO_DAYS(a.Date)-TO_DAYS('2007-7-1')>= 0) AND (TO_DAYS(a.Date)-TO_DAYS('2007-7-13') <= 0) AND a.RecordId='1040' AND b.RecordId='1030.0' AND d.RecordId='1030' 说明:前两个联合的表是同一个表。我的目的是:
1。从PrismaLog 中找到RecordId='1040'、ServerId='sip13379'且日期在'2007-7-1'到'2007-7-13'之间的记录集A,
2。然后根据A的AccountId再查找PrismaLog 中AccountId=A.AccountId且RecordId='1030.0' 的记录集B,
3。然后根据B的LogId查找PrismaLog x、LogValue y与 LogMap z的联表,其中x.LogId=B.LogId,y.LogId=x.LogId,z.LogValue=y.LogValue,z.RecordId='1030' 
最后希望能得到PrismaLog.AccountId,LogMap.Description,LogMap.Meaning,LogValue.LevelCode,LogValue.Value 。另外也试了select c1 from t1 where c2 in (select c2 from t2 where ...)的嵌套以及select p.c1,q.c2 from t1 p,t2 q where p.c3=... and q.c6=...这样的语句都是当机。不知道哪里出了问题。憋了好几天了好人来帮忙啊。。

解决方案 »

  1.   


    select LogId from PrismaLog where AccountId in
    (select AccountId from PrismaLog where RecordId='1040'and ServerId='sip13379'且日期在'2007-7-1'到'2007-7-13') and RecordId='1030.0' 以上就是b出来的logid然后你再把x,y,z的关联继续写就是了ps:你的第三个逻辑,我没看明白
      

  2.   

    klan:
    通常做到B是可以的,但是一旦用B的logid再去查联表的时候就当掉,是不是mysql不允许一个表被多次嵌套呢?(因为继续用B的logid查联表的时候PrismaLog 被用了三次,每次都是加上它就出问题)
    P.S.:当用你的这种方式查2个同名表的时候就能感觉到速度变慢,如果是异名表就快得多。
      

  3.   

    嵌套几层无所谓的,都是可以的.关键是这样出来的笛卡儿集是很大的,如果你的内存不够多的话,就会当机了折中一下,你可以把做到2的时候的数据插入一个临时表,然后再做后面的第三步吧没有必要一定要用一句sql的嘛
      

  4.   

    哦这样啊。。我还以为是mysql不支持同名表多层嵌套
    现在的解决办法就是做到2,然后利用结果集自己再跑循环本来我想一步到位的。。
    谢谢klan:)
    弱弱的问一句我怎么结帖送分给你啊