[英]How can I order by the result of a recursive SQL query
我有以下方法需要訂購:
def has_attachments?
attachments.size > 0 || (!parent.nil? && parent.has_attachments?)
end
我到現在為止:
ORDER BY
CASE WHEN attachments.size > 0 THEN 1 ELSE
(CASE WHEN parent_id IS NULL THEN 0 ELSE
(CASE message.parent ...what goes here )
END
END
END
我可能正在看這個錯誤,因為我沒有使用遞歸SQL的經驗。 本質上,我想根據郵件或郵件的任何父母是否有附件進行訂購。 如果附件大小> 0,我可以停止並返回1。如果郵件的附件大小為0,我現在檢查它是否具有父項。 如果它沒有父項,那么就沒有附件,但是,如果它確實有父項,那么我基本上必須為父項執行相同的查詢用例邏輯。
更新表如下所示
+---------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| message_type_id | int(11) | NO | MUL | | |
| message_priority_id | int(11) | NO | MUL | | |
| message_status_id | int(11) | NO | MUL | | |
| message_subject_id | int(11) | NO | MUL | | |
| from_user_id | int(11) | YES | MUL | NULL | |
| parent_id | int(11) | YES | MUL | NULL | |
| expires_at | datetime | YES | MUL | NULL | |
| subject_other | varchar(255) | YES | | NULL | |
| body | text | YES | | NULL | |
| created_at | datetime | NO | MUL | | |
| updated_at | datetime | NO | | | |
| lock_version | int(11) | NO | | 0 | |
+---------------------+--------------+------+-----+---------+----------------+
如果存在parent_id,則在其中引用父消息。 謝謝!
我假設每個附件都存儲在帶有message_id字段的附件表中。
WITH RECURSIVE msgs(id, parent_id, has_attachments, current_ancestor_id) AS
(
SELECT DISTINCT
m.id,
m.parent_id,
CASE WHEN a.message_id IS NULL THEN 0 ELSE 1 END AS has_attachments,
-- If the message has attachments, there is no point in going to any ancestors
CASE WHEN has_attachments = 0 THEN m.parent_id ELSE NULL END AS current_ancestor_id
FROM messages m
LEFT JOIN attachments a
ON m.id = a.message_id
UNION ALL
SELECT
m2.id,
m2.parent_id,
CASE WHEN (CASE WHEN a.message_id IS NULL THEN 0 ELSE 1 END) > m2.has_attachments THEN (CASE WHEN a.message_id IS NULL THEN 0 ELSE 1 END) ELSE m2.has_attachments END,
CASE WHEN has_attachments = 0 THEN m1.parent_id ELSE NULL END AS current_ancestor_id
FROM messages m1
LEFT JOIN attachments a
ON m1.id = a.message_id
INNER JOIN msgs m2
ON m1.id = m2.current_ancestor_id
)
SELECT
id,
parent_id,
has_attachments
FROM msgs
WHERE current_ancestor_id IS NULL
ORDER BY
has_attachments DESC;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.