我有兩個表,conversation
和message
(對話有很多消息)。計算最後一個關聯記錄具有負面屬性的位置
conversation:
- id
message:
- id
- conversation_id
- created_at
- read (boolean)
我想算對話,其中最後一個(由message.created_at
訂購)消息的read
屬性是false
。
我有兩個表,conversation
和message
(對話有很多消息)。計算最後一個關聯記錄具有負面屬性的位置
conversation:
- id
message:
- id
- conversation_id
- created_at
- read (boolean)
我想算對話,其中最後一個(由message.created_at
訂購)消息的read
屬性是false
。
只得到計數爲概述:
SELECT count(*) AS msg_ct
FROM (
SELECT DISTINCT ON (conversation_id) *
FROM messages
ORDER BY conversation_id, created_at DESC
) sub
WHERE NOT read;
你確實不需要包括父表conversation
這裏都沒有。
子查詢返回每個對話的最後一行("ordered by messages.created_at"
)。
詳情在這裏:Select first row in each GROUP BY group?
外部查詢計數那些read
是FALSE
。
替代與NOT EXISTS
:
SELECT count(*) AS msg_ct
FROM messages m
WHERE NOT read
AND NOT EXISTS (
SELECT 1
FROM messages m1
WHERE m1.conversation_id = m.conversation_id
AND m1.created_at > m.created_at
);
可能是大表更快。你必須用EXPLAIN ANALYZE
進行測試。
嗯:找到最後一條消息(每個conversation_id)並檢查它的read = false – wildplasser
對於每個對話? – Mihai