基于引用行和被引用行对自引用表中的引用进行计数

时间:2019-06-23 07:27:32

标签: mysql sql

我正在处理一个表,该表使用自引用外键在同一表中存储两个级别的任务(我们将其称为primarysecondary)。 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行的原因是:

  1. 它们是用户100尚未创建的主要任务

  2. 用户100尚未针对这些任务创建辅助任务

  3. 他们还没有所需数量的次要任务(即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构造此查询的更有效的方法,但不知道如何处理。

任何帮助将不胜感激。 预先感谢!

1 个答案:

答案 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