2010-07-31 164 views
0

新手問題:如何限制查詢結果與MySQL

我有那種有一個MESSAGE_ID字段(主鍵字段)和其他領域,如身體,receiver_id,SENDER_ID和PARENT_ID電子郵件表。 parent_id字段是用戶在回覆消息時將同一線程的消息連接在一起的。

現在我有一個簡單的查詢,查找特定reciever_id下的所有消息並返回它們。問題是我還想檢查2個或更多的消息是否具有相同的parent_id,如果是這樣,我只想要返回最近的消息。

任何人都可以對此有所瞭解嗎?

我想過使用一個CASE語句,但不知道從哪裏開始。

回答

1

我會添加一個時間戳到它提交時的字段。你可以使用這些類似以下的東西:

SELECT body, receiver_id, sender_id, parent_id 
FROM messages 
GROUP BY parent_id 
ORDER BY timestamp DESC 
LIMIT 1 

注:沒有辦法完全知道,如果查詢工作,但不嘗試它放在你的桌子,但希望它指向你在正確的方向。

編輯︰ @liysd提出了一個很好的觀點,由順序合併。你需要對它進行子查詢。

SELECT * 
FROM (SELECT * FROM messages WHERE parent_id = id) 
ORDER BY timestamp DESC 
LIMIT 1 
+0

這也似乎像它應該工作,但沒有工作,因爲我的一些PARENT_ID數值是NULL。對不起,我應該提前說過。 – queryne 2010-07-31 20:43:31

+0

即使沒有空值,它也不起作用。字段正文,接收方等可能來自任何沒有必要使用最大時間戳記錄的記錄。 – liysd 2010-08-01 11:45:06

+0

我不認爲這很重要,如果你的父母id是空的,你只能匹配空值給自己(即你不能匹配其中一個填充值爲null的其他父母id的值)。您只能根據填充了parent_id值的記錄進行匹配。 – John 2010-08-01 16:40:19

0

您可以使用如下嵌套查詢:

select * 
    from messages A 
    where A.receiver_id=:receiver_id 
    (and timestamp = (select max(timestamp) 
        from message B 
        where A.parent_id = B.parent_id and A.parent_id<>NULL)) 
    or A.parent_id = NULL 
+0

似乎不適合我。但是你是否想在「A.receiver_id =」和「receiver_id」之間加上「:」。 – queryne 2010-07-31 21:19:11

+0

我的意思是一個參數:receiver_id。您可以使用使用函數bindValue綁定值。相反,如果它是存儲過程的一部分,您也可以從PHP或@receiver_id編寫$ receiver_id。 – liysd 2010-08-01 11:41:59