我正试图绕过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}}。
答案 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