2010-07-31 140 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