我有 3 個表:訂單、專案和渲染。
1 個訂單可以有多個專案,每個專案都有一個帶有狀態的渲染條目。
我想要訂單 ID 和日期,其中所有專案都呈現為“完成”。
在示例中,它僅是訂單 1,其中有 2 個專案(1 和 2),其狀態在渲染表中完成
訂單表
id| date
1 | 2021-12-10
2 | 2021-12-11
專案表
id|order_id
1 | 1
2 | 1
3 | 2
4 | 2
渲染表
id|item_id| status
1 |1 | done
2 |2 | done
3 |3 | done
4 |4 | running
我想將它與 JOIN 陳述句一起使用。我試過這個,但它不像預期的那樣作業(它同時回傳,順序 1 和 2):
SELECT o.id, o.date
FROM order AS o
JOIN item AS i ON o.id = i.order_id
JOIN render r1 ON (i.`id` = r1.item_id AND r1.status = 'done')
LEFT JOIN render r2 ON (i.`id` = r2.item_id AND r2.status <> 'done')
AND r2.item_id IS NULL;
有任何想法嗎?先感謝您!
uj5u.com熱心網友回復:
SELECT t1.id
, t1.date
FROM order
t1
WHERE t1.id NOT IN
(
SELECT o.id
FROM order
o
JOIN item
i
ON i.order_id = o.id
JOIN render
r
ON r.item_id = i.id
WHERE r.status <> 'done'
)
一些列名的選擇是不幸的,這使得維護者閱讀連接條件很痛苦:如果id列參考的ID 是什么型別,一目了然并不是很明顯。
我會重命名以下列:
TABLE COLUMN_NAME BETTER_COLUMN_NAME
------ ----------- ------------------
order id order_id
order date order_date
item id item_id
render id render_id
render status render_status
我也不贊成o/ i/r表的別名,但引數是在房間12A,只是沿著走廊。
uj5u.com熱心網友回復:
在這里,我發布了它最終對我最有效的方法,以防它對任何人有幫助:)
SELECT o.id, o.date
FROM order AS o
JOIN item AS i ON o.id = i.order_id
LEFT JOIN render r ON (r.item_id = i.id)
GROUP BY o.id
HAVING GROUP_CONCAT(DISTINCT IFNULL(r.status, "NULL")) = 'done';
在 HAVING 子句中,我連接狀態,洗掉所有重復項并檢查是否只有“完成”。由于我需要對渲染進行 LEFT JOIN,因此我將回傳的空行顯式設定為“NULL”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/394461.html
上一篇:在最近的日期和按磁區加入
