2014-04-26 68 views
0

我有兩個表,conversationmessage(對話有很多消息)。計算最後一個關聯記錄具有負面屬性的位置

conversation: 
    - id 

message: 
    - id 
    - conversation_id 
    - created_at 
    - read (boolean) 

我想算對話,其中最後一個(由message.created_at訂購)消息的read屬性是false

+0

嗯:找到最後一條消息(每個conversation_id)並檢查它的read = false – wildplasser

+0

對於每個對話? – Mihai

回答

2

只得到計數爲概述:

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?
外部查詢計數那些readFALSE

替代與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進行測試。

+0

完美,非常感謝 –

+0

@VladKhomich:增加了一個alt版本。 –

+0

WHERE NOT READ做什麼? – Mihai

相關問題