我的sql语句是要把该用户最近"被回复"过的帖子和最近"回复"过的帖子都找出来其中umc_card_auction是发帖表,umc_card_bid是回帖表,umc_card_auction主键是card_auction_id,umc_card_bid的主键是card_bid_id,外键是card_auction_id,都加了索引,其他字段都没加语句如下SELECT DISTINCT a.card_auction_id,a.member_id, a.card_auction_name,a.df,a.last_reply 
FROM umc_card_auction a LEFT JOIN umc_card_bid c 
ON a.card_auction_id = c.card_auction_id 
WHERE ( a.df = 1 OR a.df = 2 ) 
AND (a.member_id = 1068 OR c.member_id = 1068) 
order by a.last_reply desc有人能帮忙分析下吗???

解决方案 »

  1.   

    原语句执行多长时间,执行以下语句多长时间?
    SELECT DISTINCT a.card_auction_id,a.member_id, a.card_auction_name,a.df,a.last_reply 
    FROM umc_card_auction a LEFT JOIN umc_card_bid c 
    ON a.card_auction_id = c.card_auction_id 
    WHERE ( a.df = 1 OR a.df = 2 ) 
    AND (a.member_id = 1068 OR c.member_id = 1068)  
      

  2.   


    SELECT 
    a.card_auction_id,
    a.member_id, 
    a.card_auction_name,
    a.df,
    a.last_reply  
    FROM umc_card_auction a
    WHERE ( a.df = 1 OR a.df = 2 )  
         AND a.member_id = 1068
    order by a.last_reply desc
      

  3.   

    为什么on 后面又用了where,不是继续and,用where前面还用left join 干什么
      

  4.   


    不明白,我用的是mysql,但这个地方的语法应该是一样的吧如果不用left join ,那该用户所发的没人回复的帖子就查不出来了。
      

  5.   

    CRTL+L看一下执行计划,是否建议添加索引。
      

  6.   

    我的意思是用了where后, left join 达不到效果了,另外既然主外键都在语句中都已关联号
    是否还有必要a.member_id = 1068 OR c.member_id = 1068 两个都要=1608?
      

  7.   


    我用的mysql,好像没有执行计划a.member_id = 1068 OR c.member_id = 1068是要把1068所发的帖子和回复的帖子都查出来
      

  8.   

    试一下去年distinct,这里慢 了
    其实C表没这么用到,改一下吧SELECT  a.card_auction_id,a.member_id, a.card_auction_name,a.df,a.last_reply  
    FROM umc_card_auction a 
    WHERE a.df in(1,2)  and a.member_id = 1068
    union all
    SELECT  a.card_auction_id,a.member_id, a.card_auction_name,a.df,a.last_reply  
    FROM umc_card_auction a 
    WHERE a.df in(1,2)  and  
      exists(select 1 from umc_card_bid c where a.card_auction_id = c.card_auction_id and c.member_id = 1068)
    order by a.last_reply desc
      

  9.   

    你可以把distinct 放在外层SQL语句中
    不对,可能是有重复吧!加上distinct
    select distinct * from
    (
    SELECT  a.card_auction_id,a.member_id, a.card_auction_name,a.df,a.last_reply  
    FROM umc_card_auction a 
    WHERE a.df in(1,2)  and a.member_id = 1068
    union all
    SELECT  a.card_auction_id,a.member_id, a.card_auction_name,a.df,a.last_reply  
    FROM umc_card_auction a 
    WHERE a.df in(1,2)  and  
      exists(select 1 from umc_card_bid c where a.card_auction_id = c.card_auction_id and c.member_id = 1068)
    ) t
    order by last_reply desc