查询ORDER BY从另一个SELECT返回的行数

时间:2013-11-26 23:12:46

标签: sql postgresql sql-order-by left-join aggregate-functions

我正试图绕过SQL,我需要一些帮助,找出如何在PostgreSQL 9.3中进行以下查询。

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

我想查询用户表,并将用户ID共同的共同朋友的数量ORDER BY。

因此,朋友表格如下:

user_id | friend_user_id
1       | 4
1       | 5
2       | 10
3       | 7

依此类推,因此用户1将4和5列为朋友,而用户2将10列为朋友,因此我希望按friend_user_id中用户1的最高计数对user_id的结果进行排序选择中的1}}。

2 个答案:

答案 0 :(得分:2)

Postgres的方法:

SELECT *
FORM   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只是表别名的噪音。但是不要在列别名中省略它。我引用了"Omitting the AS Key Word"上的手册:

      

    FROM个项目中,标准和PostgreSQL都允许省略AS   在作为未保留关键字的别名之前。但这不切实际   输出列名称,因为语法含糊不清

    大胆强调我的。

  • ISNULL()是MySQL或SQL Server的自定义扩展。 Postgres使用SQL标准函数COALESCE()。但是你不需要这里。请改用NULLS LAST clause,这样更快更干净。

  • 预计多个用户拥有相同数量的朋友。这些对等体将被任意排序。两次调用相同的函数可能会产生不同的结果,这通常是不可取的。向ORDER BY添加更多表达式。最终,主键可以解决任何剩余的歧义。

  • 如果两个表共享相同的列名user_id(就像它们应该的那样),则可以在join子句中使用语法快捷方式USING。另一个标准的SQL功能。非常受欢迎的副作用:user_id仅在SELECT *的输出中列出一次,与加入ON时相反。许多客户端甚至不会在输出中接受重复的列名称。

答案 1 :(得分:0)

这样的东西?

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
相关问题