sql - 是否可以根据 SQL-PostgreSQL 中的 CHILD 表对父表进行排序?
问题描述
甚至可以通过子表订购父表吗?假设我有 person_ID(来自父表),该 person_ID 将在子表中获得很多选票。对于父表中的一个 person_id,子表中可以有这么多票。投票可以是 +1 或 -1。因此,如果 person_ID=001 获得 5 x(+1 票)和 2 x(-1 票)。person_ID=001 的总分是+3。假设 person_ID=002 有 3 x (-1) 票。Person_ID=002 的得分为 -3。Person_ID=003 的得分为 0。
现在假设我想通过子表的总分对父表进行排序。
我知道如何对子表求和,但现在我需要根据子表的结果对父表进行排序。
SELECT
parent_id2,
SUM (votes) AS total
FROM childtbl GROUP BY parent_id2
ORDER BY total DESC
我希望查询结果如下所示
Person_ID 001 | +3
Person_ID 003 | 0
Person_ID 002 | -3
这是 SQL Fiddle 的链接。http://www.sqlfiddle.com/#!17/ea694/6
这是代码,如果它搞砸了
CREATE TABLE parenttbl
(
parent_id integer,
test character(25),
test2 character(25),
PRIMARY KEY (parent_id)
);
INSERT INTO parenttbl (parent_id, test, test2) VALUES (1,'adam','test'), (2,'steven','test'), (3, 'bob','test');
CREATE TABLE childtbl
(
child_id integer,
parent_id2 integer,
votes integer,
PRIMARY KEY (child_id),
FOREIGN KEY (parent_id2)
REFERENCES parenttbl (parent_id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
);
INSERT INTO childtbl (child_id, parent_id2, votes) VALUES (1,1,1), (2,1,1), (3, 1, 1),(4,1,-1), (5,2,1), (6, 2, 1),(7,3,-1), (8,3,-1), (9, 3, -1),(10, 1, 1),(11,3,1),(12,3,1),(13,3,1)
谢谢你们!
解决方案
如果我正确地跟着你,你只需要left join
,聚合和排序:
SELECT p.parent_id, COALESCE(SUM(c.votes), 0) total_votes
FROM parenttbl p
LEFT JOIN childtbl c ON c.parent_id2 = p.parent_id
GROUP BY p.parent_id
ORDER BY total_votes DESC
left join
允许父母没有投票权,在这种情况下COALESCE(SUM(c.votes), 0)
给出0
.
您可能还想预先聚合子表,因此您不需要在外部查询中进行聚合 - 这使得从父表返回更多列看起来很简单(而在前一个查询中,您需要添加每一列条款group by
):
SELECT p.*, COALESCE(c.votes, 0) total_votes
FROM parenttbl p
LEFT JOIN (
SELECT parent_id2, SUM(votes) votes FROM childtbl GROUP BY parent_id2
) c ON c.parent_id2 = p.parent_id
ORDER BY total_votes DESC
推荐阅读
- mysql - 在mysql中添加具有相关子查询的自动生成列
- javascript - 如何获取 id 来创建语音通道
- python - 如何调整 Selenium 元素坐标和 PyAutoGUI 坐标之间的可变性?
- r - 根据来自另一个 df 的值将组添加到一个 df
- postgresql - 加速 spark df.write 到 PostgreSQL 的最佳参数
- r - 如何根据多个其他列中的值减去一列中的值?
- r - 加入数据帧时 R 中的 Where 子句
- android - Firebase 错误:需要一个列表,但有一个类 java.util.HashMap
- containers - 在 Ubuntu 20.04 中运行 podman 的问题
- r - 如何在堆积条形图中的两个水平条之间插入文本