Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按从另一个SELECT返回的行数查询订单_Sql_Postgresql_Sql Order By_Left Join_Aggregate Functions - Fatal编程技术网

Sql 按从另一个SELECT返回的行数查询订单

Sql 按从另一个SELECT返回的行数查询订单,sql,postgresql,sql-order-by,left-join,aggregate-functions,Sql,Postgresql,Sql Order By,Left Join,Aggregate Functions,我正试图了解SQL,我需要一些帮助来了解如何在PostgreSQL 9.3中执行以下查询 我有一个用户表和一个朋友表,其中列出了多行中的用户ID和朋友的用户ID 我想查询用户表,并按用户ID中的共同好友数排序 因此,friends表如下所示: user_id | friend_user_id 1 | 4 1 | 5 2 | 10 3 | 7 依此类推,用户1将4和5列为好友,用户2将10列为好友,因此我想根据friend\u user\u id中

我正试图了解SQL,我需要一些帮助来了解如何在PostgreSQL 9.3中执行以下查询

我有一个用户表和一个朋友表,其中列出了多行中的用户ID和朋友的用户ID

我想查询用户表,并按用户ID中的共同好友数排序

因此,friends表如下所示:

user_id | friend_user_id
1       | 4
1       | 5
2       | 10
3       | 7
依此类推,用户1将4和5列为好友,用户2将10列为好友,因此我想根据
friend\u user\u id
中用户1的最高计数对select中的
user\u id
的结果进行排序。

类似的内容

SELECT * FORM [users] u
LEFT JOIN (SELECT user_id, COUNT(*) friends FROM fields) f
ON u.user_id = f.user_id
ORDER BY ISNULL(f.friends,0) DESC

Postgres的方法是:

SELECT *
FROM   users u
LEFT   JOIN (
   SELECT user_id, count(*) AS friends
   FROM   friends
   ) f USING (user_id)
ORDER  BY f.friends DESC NULLS LAST, user_id  -- as tiebreaker
  • 关键字
    AS
    只是表别名的噪声。但不要从列别名中忽略它。该手册涉及:

    FROM
    项中,标准和PostgreSQL都允许省略
    AS
    在作为未保留关键字的别名之前。但这是不切实际的 对于输出列名,由于语法歧义

    我的

  • ISNULL()
    是MySQL或SQL Server的自定义扩展。Postgres使用SQL标准函数。但你不需要在这里。改为使用
    NULLS LAST
    子句,这会更快更干净。见:

  • 多个用户将拥有相同数量的朋友。这些对等点将被任意排序。重复执行可能会产生不同的排序顺序,这通常是不可取的。将更多表达式添加到按排序的
    。最终,主键解决了任何剩余的歧义

  • 如果这两个表共享相同的列名
    user\u id
    (就像它们应该共享的那样),则可以在join子句中使用语法快捷方式
    USING
    。另一个标准SQL特性。欢迎使用的副作用:
    user\u id
    仅在
    SELECT*
    的输出中列出一次,而不是在
    上加入
    时。许多客户端甚至不接受输出中重复的列名


请发布您的表架构和您希望的排序输出类型的示例。除了PostgreSQL中没有
ISNULL
之外,这是一个MySQL ism。标准SQL使用
合并