代码之家  ›  专栏  ›  技术社区  ›  swamprunner7

MySQL子查询

  •  1
  • swamprunner7  · 技术社区  · 16 年前

    我们可以不带子查询进行这个查询吗?

    SELECT login, post_n,
    
    (SELECT SUM(vote) FROM votes WHERE votes.post_n=posts.post_n)AS votes, 
    (SELECT COUNT(comments.post_n) FROM comments WHERE comments.post_n=posts.post_n)AS comments_count 
    
    FROM users, posts 
    WHERE posts.id=users.id AND (visibility=2 OR visibility=3) 
    ORDER BY date DESC LIMIT 0, 15
    

    用户:id,登录

    职位:职位,身份证,能见度

    投票:投票后

    3 回复  |  直到 16 年前
        1
  •  2
  •   Michael Buen    16 年前

    是的,有可能:

    SELECT login, post_n,
    
    SUM(vote) as votes,
    
    FROM users 
    JOIN posts using(id)
    LEFT JOIN votes using(post_n)
    WHERE visibility=2 OR visibility=3 
    GROUP BY login, post_n
    

    然后将结果展平:

    select * from 
    (
        SELECT login, post_n,
    
        SUM(vote) as votes,
    
        FROM users 
        LEFT JOIN posts using(id)
        LEFT JOIN votes using(post_n)
        WHERE visibility=2 OR visibility=3 
        GROUP BY login, post_n
    ) as votes_count
    

    然后加入评论:

    select votes_count.login, votes_count.post_n, votes_count.votes, 
    
        COUNT(comments.post_n) as comments_count
    
    from 
    (
        SELECT login, post_n,
    
        SUM(vote) as votes,
    
        FROM users 
        LEFT JOIN posts using(id)
        LEFT JOIN votes using(post_n)
        WHERE visibility=2 OR visibility=3 
        GROUP BY login, post_n
    ) as votes_count
    LEFT JOIN comments using(post_n)
    GROUP BY votes_count.login, votes_count.post_n
    ORDER BY date DESC LIMIT 0, 15
    
        2
  •  0
  •   Maksim Burnin    16 年前

        3
  •  0
  •   swamprunner7    16 年前

    没有子查询变量更慢,0.0208秒,mysql在投票表中只使用271行,但当我使用连接时,它使用整行。这里没有子查询变量:

    SELECT res.*, COUNT(*) FROM
    (
      SELECT login, posts.post_n, SUM(vote)AS votes
      FROM users, posts, votes
      WHERE users.id=posts.id AND posts.post_n=votes.post_n AND visibility=3
      GROUP BY posts.post_n
    )AS res, comments
    WHERE comments.post_n=res.post_n
    GROUP BY res.post_n
    ORDER BY date DESC
    LIMIT 0, 15