Подсчет ссылок в самоссылающейся таблице на основе ссылающихся и ссылочных строк - PullRequest
0 голосов
/ 23 июня 2019

Я работаю над таблицей, в которой хранятся два уровня задач (назовем это primary и secondary), в одной и той же таблице, используя независимые внешние ключи.Столбец secondary_for - это собственная ссылка на tasks.id, где user - это ссылка на другую таблицу.

Для каждой задачи primary потребуется 2 secondary задач, которые будут получены от различных пользователей.(по одному от каждого), кроме пользователя, который создал задачу primary для ее решения.Для данного пользователя я пытаюсь найти способ ранжировать нерешенные primary задачи для этого пользователя (чтобы я мог создать для него новую задачу secondary), что позволяет быстрее всего решать нерешенные primary задачи..

Итак, если состояние таблицы tasks выглядит следующим образом:

+----+------+---------------+-----------------------------+
| id | user | secondary_for |            desc             |
+----+------+---------------+-----------------------------+
|  1 |    1 | NULL          | Primary Task 1              |
|  2 |    2 | 1             | Update 1 for Primary Task 1 |
|  3 |    3 | 1             | Update 2 for Primary Task 1 |
|  4 |    2 | NULL          | Primary Task 2              |
|  5 |    1 | 4             | Update 1 for Primary Task 2 |
|  6 |    3 | NULL          | Primary Task 3              |
+----+------+---------------+-----------------------------+ 

... и пользователь 100 (который существует в таблице users) доступен для добавлениявторичной задаче, я хочу представить список подходящих идентификаторов первичных строк, отсортированных по номеру вторичной задачи против нее:

+-----------+
| id |  ctr |
+-----------+
|  4 |    1 |
|  6 |    0 |
+-----------+

Здесь представлены строки 4 и 6, потому что:

  1. это основные задачи, которые пользователь 100 еще не создал

  2. пользователь 100 еще не создал дополнительную задачу для этих задач

  3. у них пока нет необходимого количества дополнительных задач (т.е. 2), в отличие от строки 1

Я новичок в MySQL, поэтому яне знаю, как к этому подойти, но вот что у меня так далеко:

SELECT secondary_for AS id, COUNT(id) AS ctr FROM tasks
WHERE secondary_for IN
    (SELECT id FROM tasks WHERE secondary_for IS NULL AND user !=100)
    AND user != 100
GROUP BY secondary_for
HAVING COUNT(id) < 2
ORDER BY COUNT(id) DESC

, что заставляет меня подняться:

+-----------+
| id |  ctr |
+-----------+
|  4 |    1 |
+-----------+

, но не показывает строку 6, которая также подходит, но не извлекается, поскольку для нее еще не назначены дополнительные задачи.

Как это исправить?Кроме того, я почти уверен, что существует более эффективный способ создания этого запроса с использованием JOIN, но не знаю, как это сделать.

Любая помощь будет принята с благодарностью.Заранее спасибо!

1 Ответ

0 голосов
/ 23 июня 2019

Как насчет этого?

SELECT A.id, ISNULL(B.ctr,0) AS ctr
FROM tasks A
LEFT JOIN (SELECT secondary_for, COUNT(*) AS ctr
           FROM tasks
           WHERE user!=100
           GROUP BY secondary_for) B
ON A.id=B.secondary_for
WHERE A.secondary_for IS NULL
AND A.user != 100
AND ISNULL(B.ctr,0)<2
ORDER BY ISNULL(B.ctr,0) DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...