Можно ли ЗАКАЗАТЬ родительскую таблицу на основе таблицы CHILD в SQL - PostgreSQL? - PullRequest
0 голосов
/ 27 февраля 2020

Можно ли даже заказать родительский стол по дочернему столу? Скажем, у меня есть person_ID (из родительской таблицы), что person_ID получит много голосов в дочерней таблице. Так много голосов может быть в дочерней таблице для одного person_id в родительской таблице. Голоса могут быть +1 или -1. Таким образом, если person_ID = 001 получает 5 х (+1 голос) и 2 х (-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)

Спасибо, ребята!

1 Ответ

1 голос
/ 27 февраля 2020

Если я следил за вами правильно, вам просто нужно 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
...