我想从以下数据库中获取一些字段:
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 =接收者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发送第3条消息。
这意味着我只能获得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"
但我无法得到我想要的结果。
有人能解释我怎么做吗?
编辑:我只想构建用户消息的线程,这些消息将显示两个用户之间发送的最后一条消息(这是查询的范围)
答案 0 :(得分: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
);
答案 1 :(得分:2)
我认为你可以使用group-by获取值..
从ID中的消息中选择*(从fra ='“的消息中选择max(ID)。$ _ SESSION ['userid']。”'OR til ='“。$ _ SESSION ['userid']。”' GROUP BY fra,til)
答案 2 :(得分:1)
这不是DISTINCT的情况,更多的是你希望将结果限制为1条记录。试试这个:
SELECT * FROM messages WHERE fra='".$_SESSION['userid']."' OR til='".$_SESSION['userid']."' ORDER BY `date` DESC LIMIT 1
答案 3 :(得分:0)
我认为您可以使用某种“key =&gt; 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