Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL通过聊天中的两列进行分组_Mysql_Group By_Row_Chat_Concat - Fatal编程技术网

MYSQL通过聊天中的两列进行分组

MYSQL通过聊天中的两列进行分组,mysql,group-by,row,chat,concat,Mysql,Group By,Row,Chat,Concat,我正在设置聊天服务。 “我的邮件”的表格创建如下: CREATE TABLE message ( fromId int NOT NULL, toId int NOT NULL, message text NOT NULL, timestamp timestamp NOT NULL, toRead int NOT NULL, FOREIGN KEY (fromId) REFERENCES users(id) ON DELETE SET NULL,

我正在设置聊天服务。 “我的邮件”的表格创建如下:

CREATE TABLE message (
    fromId int NOT NULL,
    toId int NOT NULL,
    message text NOT NULL,
    timestamp timestamp NOT NULL,
    toRead int NOT NULL,
    FOREIGN KEY (fromId) REFERENCES users(id) ON DELETE SET NULL,
    FOREIGN KEY (toId) REFERENCES users(id) ON DELETE SET NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
作为一个用户,我应该得到我已经与之交谈过的所有其他用户。因此,我创建了一个sql语句:

SELECT u.name, u.surname, u.id, m.toRead, m.timestamp, m.fromId, m.toId 
FROM message m, user_informations u 
WHERE (m.toId = '2' AND m.fromId = u.id) OR (m.fromId = '2' AND m.toId = u.id) 
GROUP BY concat(m.fromId, m.toId OR m.toId, m.fromId) 
ORDER BY m.timestamp LIMIT 10;
只要一个用户只写另一个用户,它就可以工作。如果两者都已相互写入,则返回两列

'Peter','Tester','1','0','2015-07-27 16:10:11','1','2'
'Peter','Tester','1','0','2015-07-27 17:14:22','2','1'
因为第一个结果中的
fromId
与第二个结果不同,并且与
toId
相同


如何使语句只返回一行?

删除OR语句
(m.toId='2'和m.fromId=u.id)
您应该只从登录用户处查找这些语句。或者,如果有人给我寄了东西,而我什么也没寄回来,那么就定义为“聊天”。。我没有和他们“聊天”。。。他们给我发了一些东西,如果你也想要这些,那么你会得到像这样的副本,消除它们的唯一方法是不要同时分组。你能发布一个更大的输入行样本供我们测试吗?在from/to列上使用
LEAST(),best()
可能会解决这个问题。我需要
(m.toId='2'和m.fromId=u.id)
语句,因为如果我只发送了一条消息而没有收到任何消息,我就不会得到聊天记录OK,所以你对聊天记录的定义是你发送到的任何东西和你从单向收到的任何东西。双向是不必要的。
LEAST()
确实有效。谢谢您摆脱OR语句
(m.toId='2'和m.fromId=u.id)
您应该只从登录的用户那里查找那些。或者,如果有人给我寄了东西,而我什么也没寄回来,那么就定义为“聊天”。。我没有和他们“聊天”。。。他们给我发了一些东西,如果你也想要这些,那么你会得到像这样的副本,消除它们的唯一方法是不要同时分组。你能发布一个更大的输入行样本供我们测试吗?在from/to列上使用
LEAST(),best()
可能会解决这个问题。我需要
(m.toId='2'和m.fromId=u.id)
语句,因为如果我只发送了一条消息而没有收到任何消息,我就不会得到聊天记录OK,所以你对聊天记录的定义是你发送到的任何东西和你从单向收到的任何东西。双向是不必要的。
LEAST()
确实有效。非常感谢。