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

内部联接查询建议

  •  0
  • Lovelock  · 技术社区  · 11 年前

    我需要关于创建内部联接查询的帮助。

    我有两张桌子、博客和追随者。

    在博客表中我有所有的博客信息,然后在关注者中我有两个字段,分别是用户id和用户关注的博客id。

    我想创建一个查询,根据有多少关注者来排序博客。

    因此,这是一个我用来展示用户正在进行的构建的示例(供参考):

        $query = "SELECT * FROM blogs INNER JOIN followers ON (blogs.id = followers.blogid) WHERE followers.userid='" .$usernamesesh. "'";
    

    我如何才能创建一个类似的查询,选择所有博客,但按关注者从高到低排序。

    希望这有道理,因为某种原因,我无法理解这一点!

    唯一的其他选择是在博客表中添加一些关注者字段,但这需要更改我的关注脚本等。

    克雷格。

    4 回复  |  直到 11 年前
        1
  •  1
  •   Mithrandir    11 年前

    如果不知道表格的确切结构,就很难判断。假设你的关注者表看起来像这样

       blogid | userid
       -------+----------
         1    |  2
       -------+----------
         1    |  1
       -------+----------
         1    |  3
       -------+----------
         2    |  2
       -------+---------
    
     SELECT blogid, COUNT(userid) AS UserCount FROM followers 
     GROUP BY blogid ORDER BY UserCount DESC;
    

    然后,您可以加入博客表,从该表中获取所需的列。

    SELECT blogs.*, IFNULL(f.UserCount,0) AS UserCount
    FROM blogs 
     LEFT JOIN (
        SELECT blogid, COUNT(userid) AS UserCount FROM followers 
        GROUP BY blogid
     ) f
     ON f.blogid = blogs.id
     ORDER BY UserCount DESC
    
        2
  •  0
  •   Scott    11 年前

    我建议稍微调整一下Mihai的建议,所以在查询的末尾添加这个字符串: GROUP BY blogs.id ORDER BY COUNT(userid) DESC

        3
  •  0
  •   artud2000    11 年前
    $query = "SELECT blogs.id, count(*) AS total FROM blogs INNER JOIN followers ON (blogs.id = followers.blogid) WHERE followers.userid='" .$usernamesesh. "'" GROUP BY blogs.id ORDER BY total;
    

    希望这能有所帮助

        4
  •  0
  •   Fabian    11 年前

    您可以根据子查询加入:

    SELECT blogs.*, s.cnt
    FROM blogs 
         LEFT JOIN (SELECT blogid, count(*) as cnt 
                    FROM followers
                    GROUP BY blogid) s
         ON s.blogid = blogs.id
    ORDER BY s.cnt
    

    编辑

    具有

    CREATE TABLE blogs (id);
    create TABLE followers(blogid);
    INSERT into blogs values (1),(2),(3);
    INSERT into followers values (1),(1),(3);
    

    您可以:

    id          cnt
    ----------  ----------
    2
    3           1
    1           2