【问题标题】:Inner Join Query Advice内连接查询建议
【发布时间】:2013-10-31 15:25:44
【问题描述】:

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

我有 2 个表格、博客和关注者。

在 blogs 表中我有所有博客信息,然后在关注者中我有两个字段,即用户 ID 和用户关注的博客 ID。

我想创建一个查询,按照关注者的数量对博客进行排序。

所以这是我用来显示用户正在遵循的构建的示例(供参考):

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

我怎样才能创建一个类似的查询来选择所有博客,但按照从高到低的追随者顺序排列它们。

希望这是有道理的,由于某种原因我无法理解这个!

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

克雷格。

【问题讨论】:

  • GROUP BY userid ORDER BY COUNT(userid) DESC 类似的东西

标签: php mysql sql database inner-join


【解决方案1】:

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

   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;

然后您可以加入 blogs 表以从该表中获取您需要的任何列。

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

【讨论】:

  • 这是一个,几乎只需要在其中添加一个where子句即可。我的 blogs 表中有一个“frontpage”字段,在哪里可以将 WHERE frontpage = 1 放入上述查询中?我在通常的地方尝试过,但出现错误,
  • 在 ORDER BY 子句之前
  • 大侠,感谢您的帮助。我会花一些时间来理解这个查询,但我会到达那里:)
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    $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】:

      你可以加入一个子查询:

      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
      

      【讨论】:

      • 您可以按照@Mithrandir 的建议添加一个 IFNULL,以便为没有关注者的博客获取 0 而不是 null。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      • 2017-10-19
      • 2016-03-29
      • 2015-06-21
      • 2013-07-06
      相关资源
      最近更新 更多