1

我正在尝试从以下数据库中获取一些字段:

CREATE TABLE `messages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `message` text,
  `date` datetime DEFAULT NULL,
  `fra` int(11) DEFAULT NULL,
  `til` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;


Fra = 发件人 ID;
til = Receiver ID

例如具有以下值:

(1, 'This is a message for Obama', '2012-11-14 01:12:06', 1, 3),
(2, 'Hello John! How are you?', '2012-11-14 01:23:43', 3, 1),
(3, 'Hey Jack', '2012-11-14 01:28:11', 1, 2),
(4, 'How are you son?', '2012-11-14 01:28:15', 1, 2),
(5, 'everything allright for you?', '2012-11-14 01:28:23', 1, 2);


我想从数据库中获取字段的方式如下:
我想从一个用户到另一个用户的唯一对话。如果用户 1 给用户 3 发送了一条消息,用户 3 回复了用户 1,那么我只想选择最后一个字段进入数据库;或者,如果用户 1 已向用户 2 发送了 3 条消息,那么我只想从用户 1 向用户 2 获取第三条消息。这意味着我应该只得到 2 行结果

我努力了:

SELECT DISTINCT * FROM messages WHERE fra='".$_SESSION['userid']."' OR til='".$_SESSION['userid']."' GROUP BY fra,til"



"SELECT DISTINCT(til) AS til FROM messages WHERE fra='".$_SESSION['userid']."' OR til='".$_SESSION['userid']."'  ORDER BY id DESC"

但我无法得到我想要的结果。

有人可以解释我该怎么做吗?

编辑:我只想构建将显示两个用户之间发送的最后一条消息的用户消息线程(这是查询的范围)

4

4 回答 4

2

我认为您可以使用 group-by 也可以获取值..

select * from messages where ID in (select max(ID) from messages where fra='".$_SESSION['userid']."' OR til='".$_SESSION['userid']."' GROUP BY fra ,直到)

于 2012-11-14T09:09:35.197 回答
2

这是 sql 语句的答案/示例: http ://sqlfiddle.com/#!2/ae56b/10

select * 
from messages m1
where m1.date = (select max(m2.date) 
    from messages m2 
    where 
    case when m2.fra < m2.til then m2.fra else m2.til end = 
    case when m1.fra < m1.til then m1.fra else m1.til end
    and 
    case when m2.fra > m2.til then m2.fra else m2.til end = 
    case when m1.fra > m1.til then m1.fra else m1.til end
);
于 2012-11-14T08:54:17.337 回答
1

这并不是真正的 DISTINCT 情况,更多的是您希望将结果限制为 1 条记录的情况。尝试这个:

SELECT * FROM messages WHERE fra='".$_SESSION['userid']."' OR til='".$_SESSION['userid']."' ORDER BY `date` DESC LIMIT 1
于 2012-11-14T08:37:26.327 回答
0

我认为你可以使用某种“key=>value”集合来模拟它

您的查询可以是

SELECT @discution := (MAX(til,Fra)+","+MIN(til,Fra)) AS key , messages.* FROM messages
 ORDER BY id DESC LIMIT 1 OFFSET 0 GROUP BY @discution 
于 2012-11-14T08:40:42.800 回答