2011-01-10 70 views
1

排序我試圖選擇所有在他們對話中最後的註釋。如果他們具有相同的object_id和type_id,則註釋處於相同的對話中。這是我現在的查詢:使用分組的sql查詢時遇到問題,並按

select * from comments 
where user_id != #{current_user.id} 
group by type_id, object_id 
order by created_at desc 

它的作品除了評論並不總是最後的談話。我怎樣才能做到這一點?我需要它在mysql和sqlite3中工作。

+0

請包括評論表的模式。什麼是'type_id`和什麼是`object_id`?另外,你使用的是什麼ORM(如果有的話):ActiveRecord,Sequel或者只是原始的SQL命令? – Phrogz 2011-01-10 16:51:48

+0

給定的sql命令應該會給你所需要知道的所有信息 – tybro0103 2011-01-10 17:18:06

+0

這個問題與Ruby或Rails有什麼關係? – klew 2011-01-10 17:18:56

回答

0

這是一個猜測,但需要更多關於模式的信息才能確定。你是否需要/只需要最後一條評論,或者你是否想要找到最後的n評論每「對話」?

SELECT * 
    FROM comments 
    WHERE user_id != ... 
ORDER BY type_id, 
     object_id, 
     created_at DESC 
1

這個查詢是不是很漂亮(很可能是你的服務器上運行慢),但...

SELECT 
    MAX(created_at) created_at, 
    * 
FROM 
    comments 
WHERE 
    user_id != #{current_user.id} 
GROUP BY 
    type_id, 
    object_id 
ORDER BY 
    created_at DESC 

編輯:只注意到這不起作用。需要的是表格模式來解決這個問題。

1

如果你有一個GROUP的麻煩首先要做的就是避免使用'*'。這是由MySQL提供的SQL的標準GROUP BY的擴展。

經典組必須包含select中使用的所有非聚合列。 MYSQL讓你避免了非常基本的事實,並得到結果一些隨機性:

類似MySQL擴展適用於 HAVING子句。如果SQL標準 不包含在集合函數 中,則不允許HAVING子句給 命名GROUP BY子句中未找到的任何列。 MySQL允許使用這種列來簡化 的計算。 此擴展假設 未分組的列將具有 相同的分組值。否則, 結果是不確定的

因此,嘗試使用普通選擇查詢的更新版本。

0

無法僅使用GROUP BY查詢來獲得所需的結果。原因是沒有辦法指示RDBMS選擇與GROUPed集合中最後一條註釋相對應的註釋文本。

而是做到這一點:

SELECT * FROM comments 
    WHERE user_id != #{current_user.id} AND created_at = 
    (SELECT MAX(created_at) FROM comments WHERE user_id != #{current_user.id}) 

SELECT * FROM comments c1 
    WHERE user_id != #{current_user.id} AND NOT EXISTS 
    (SELECT * FROM comments c2 
     WHERE user_id != #{current_user.id} AND c2.created_at > c1.created_at) 

(我用COMMENT_ID因爲它不清楚是什麼確定的意見,但如果它的object_id然後用它來代替)。

0

如果你要選擇的每個組TYPE_ID和OBJECT_ID內的最後意見,使用子查詢:

select c1.* 
from comments c1 
join (
    select type_id, object_id, max(created_at) last_comment_created_at 
    from comments 
    where user_id != #{current_user.id} /* indicates 'comment'? */ 
    group by type_id, object_id 
) c2 
on c2.type_id = c1.type_id 
    and c2.object_id = c1.object_id 
    and c2.last_comment_created_at = c1.created_at 

這個工程除了存在具有完全相同TYPE_ID,OBJECT_ID和created_at」值的多個評論。所以如果有像'comment_order'這樣的列,那比'created_at'更可取。