我正在处理一个表,该表使用自引用外键在同一表中存储两个级别的任务(我们将其称为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的列表,该ID按其对应的辅助任务的编号排序当前:
+-----------+
| id | ctr |
+-----------+
| 4 | 1 |
| 6 | 0 |
+-----------+
出现第4行和第6行的原因是:
它们是用户100尚未创建的主要任务
用户100尚未针对这些任务创建辅助任务
他们还没有所需数量的次要任务(即2), 与第一行相反
我是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构造此查询的更有效的方法,但不知道如何处理。
任何帮助将不胜感激。 预先感谢!
答案 0 :(得分:0)
那呢?
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