[英]Counting references in a self referenced table based on both the referring and referenced rows
我正在使用自引用外鍵在同一個表中存儲兩個級別的任務(我們稱之為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 | 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 構建此查詢,但不知道如何去做。
任何幫助將不勝感激。 提前致謝!
那這個呢?
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.