Я работаю над таблицей, в которой хранятся два уровня задач (назовем это 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, потому что:
это основные задачи, которые пользователь 100 еще не создал
пользователь 100 еще не создал дополнительную задачу для этих задач
у них пока нет необходимого количества дополнительных задач (т.е. 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, но не знаю, как это сделать.
Любая помощь будет принята с благодарностью.Заранее спасибо!