我有兩個表,tasks和views,結構如下:
- 任務
- - ID
- - 地位
- 意見
- - ID
- -- taskid(tasks.id 的 FK)
- - 地位
并且 tasks 表有一行 id = 1 和 status = 1,而 views 表有兩行 id = 1,taskid = 1,status = 1 和 id = 2,taskid = 1,status = 0。
當我嘗試獲取所有視圖狀態設定為 1 并且任務本身也設定為 1 的所有任務 ID 時,我回傳一個任務 ID = 1 的行,因為視圖編號 1 設定為 1并且視圖編號 2 設定為 0。
所以基本上,我需要的是一個 SQL 陳述句,它為每個任務回傳一行,它的所有視圖和任務狀態都設定為 1(tasks.status = 1,views.status = 1),并且只有當這種情況發生時,如果任何任務的視圖都設定為不同于 1 的值,則 SQL 陳述句不會回傳它。
到目前為止,這是我的 SQL 陳述句,哪種有效,但我仍然缺少一些東西,因為它沒有按預期作業。對不起,如果有什么不清楚!
SELECT tasks.id FROM tasks JOIN views ON tasks.id = views.taskid WHERE tasks.status = 1 AND views.status = 1;
uj5u.com熱心網友回復:
加入tasks使用聚合的查詢僅回傳taskidminstatus設定為 1 的 s (這意味著沒有0):
SELECT t.id
FROM tasks t
INNER JOIN (
SELECT taskid
FROM views
GROUP BY taskid
HAVING MIN(status) = 1
) v ON v.taskid = t.id
WHERE t.status = 1;
uj5u.com熱心網友回復:
with t as (select taskid,
count(status) status_cnt,
sum(case when status = 1 then 1 else 0 end) as status_1_cnt
from views
group by taskid),
t2 as (select taskid from t where status_1_cnt > 0 and status_cnt = status_1_cnt)
select tasks.id from tasks join t2 on tasks.id = t2.taskid and status = 1
因此,如果我正確閱讀了您的問題,您希望視圖中的所有狀態都為每個 taskid 1 個。所以我會計算視圖狀態并將該計數與視圖狀態為 1 的位置進行比較。(案例陳述)。
然后只需將其加入任務狀態為 1 的任務表
(雖然我更喜歡@forpas 的回答)
uj5u.com熱心網友回復:
從概念上講,您只想加入視圖表中狀態 = 1 的記錄,如下所示:
SELECT A.id
FROM
tasks A
INNER JOIN
(
SELECT
tasks.taskid
FROM
views
WHERE
view.status = 1
) B
ON A.id = B.taskid
盡管語法不太直觀,但這是等效的并且更短:
SELECT
tasks.id
FROM
tasks
JOIN views
ON tasks.id = views.taskid
AND view.status = 1
WHERE
tasks.status = 1
這也應該起作用,出于不同的原因(更像是一個技巧):
SELECT A.id
FROM
tasks A
INNER JOIN views B
ON a.id = b.taskid
and a.status = b.status
WHERE
A.status = 1
如果這就是您需要的測驗,這可能會更加嚴格(視圖中的匹配記錄要求視圖中不存在狀態 = 0 的其他記錄) - 但我想避免這種在實際中使用相關子查詢的方式如果桌子很大,則壽命:
SELECT A.id
FROM
tasks A
INNER JOIN views B
ON A.id = B.taskid
WHERE
A.status = 1
AND B.status = 1
AND NOT EXISTS (SELECT * FROM views c
WHERE c.taskid = b.taskid and c.status = 0)
最后,這是一個在概念上更多地考慮集合交集的解決方案:
SELECT A.id
FROM
tasks a
INNER JOIN views a
ON A.id = b.taskid
AND b.status = 1
LEFT JOIN views c
ON a.id = c.taskid
AND c.status = 0
WHERE
A.status = 1
AND c.status is null
我剛剛看到 forpas 剛剛展示了一個不同但非常好的解決方案,它使用帶有 min() 子句的聚合從視圖中只選擇適當的記錄用于加入任務,這對我來說似乎是贏家:)
uj5u.com熱心網友回復:
如果我對您的理解正確,您想獲得idtask ,當且僅當它的 status = 1 時,并且views表中有特定的記錄 ONLY same status= 1。
那么您的查詢將是這樣的:
select tasks.id
from tasks
where status =1 and not exists(
select 1
from views
where taskid=tasks.id and views.status!=tasks.status)
檢查演示https://www.db-fiddle.com/f/cQfQMx5LGJN516ND2iVj8y/3
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486151.html
