Как упорядочить одну таблицу по количеству значений внешнего ключа в другой? - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь упорядочить одну таблицу (comment_thread) по количеству отдельных комментариев в другой таблице (comment_comment).

comment_thread

|------------|---------------|
|      id    |     obj_id    |
|------------|---------------|
|      1     |       24      |
|------------|---------------|
|      2     |       34      |
|------------|---------------|

comment_comment

|------------|---------------|---------------|
|      id    |   thread_id   |      des      |
|------------|---------------|---------------|
|      1     |      24       |     test 1    |
|------------|---------------|---------------|
|      2     |      34       |     test 2    |
|------------|---------------|---------------|
|      3     |      34       |     test 3    |
|------------|---------------|---------------|
|      4     |      34       |     test 4    |
|------------|---------------|---------------|
|      5     |      24       |     test 8    |
|------------|---------------|---------------|

Желаемый выход

|------------|---------------|
|      id    |     obj_id    |
|------------|---------------|
|      2     |       34      |
|------------|---------------|
|      1     |       24      |
|------------|---------------|

Текущий запрос

SELECT ctr.obj_id FROM
(SELECT thread_id FROM comment_comment
group by thread_id ORDER BY COUNT(thread_id) DESC) cc
LEFT JOIN comment_thread ctr ON cc.thread_id = ctr.id

Запрос не возвращает таблицу comment_comment в правильном порядке. Кто-нибудь может мне помочь с этим?

Проверка реальных данных:

https://dbfiddle.uk/?rdbms=postgres_9.4&fiddle=7cd9585fd88381818f9581d17fa338f1:

ID 119 должен быть первым,

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Спасибо @ sticky-bit, ваше решение сработало, я просто ссылался на неправильный столбец в сравнении.

Окончательный запрос

SELECT ct.id,
       ct.obj_id
       FROM comment_thread ct
            LEFT JOIN (SELECT cc.thread_id,
                              count(*) count
                              FROM comment_comment cc
                              GROUP BY cc.thread_id) x
                      ON x.thread_id = ct.id
       ORDER BY x.count DESC
                        NULLS LAST;
0 голосов
/ 16 января 2019

ORDER BY в подзапросе не имеет (гарантированного) эффекта. Это должно быть для самого внешнего запроса.

Либо используйте коррелированный подзапрос в предложении ORDER BY.

SELECT ct.id,
       ct.obj_id
       FROM comment_thread ct
       ORDER BY (SELECT count(*)
                        FROM comment_comment cc
                        WHERE cc.thread_id = ct.obj_id) DESC;

Или оставьте объединение и порядок объединения по объединенному количеству.

SELECT ct.id,
       ct.obj_id
       FROM comment_thread ct
            LEFT JOIN (SELECT cc.thread_id,
                              count(*) count
                              FROM comment_comment cc
                              GROUP BY cc.thread_id) x
                      ON x.thread_id = ct.obj_id
       ORDER BY x.count DESC
                        NULLS LAST;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...