mySQL查询以相同的条件检索数据

时间:2017-10-27 07:38:46

标签: javascript mysql for-loop socket.io

我已经使用MySQL数据库在Node-JS和Socket.io中创建了一个聊天应用程序。我完成了所有事情但却陷入了一件事,我无法解决。当用户登录其帐户时,会将其重定向到其收件箱,然后显示与其聊天的用户列表。例如,当John点击列表中的Doe名称以打开聊天时,当前登录的用户是John并且他与人名Doe聊天时间从数据库中检索所有消息。数据以Array of Objects存储在变量data中。我在代码中做了什么,我通过这个data循环并将每条消息附加到聊天框。显示所有消息的位置。每封邮件Message ToMessage From分为两类。这些类别是因为要区分谁发短信的人。然后我更改这些消息的background color。从我这边发送的邮件将有背景Grey,发送给我的人将有Blue背景。

现在我遇到的基本问题是,当From MessagesTo Messages的长度小于 13 时,聊天会按顺序显示,并且每条消息都会显示是在正确的地方。但是,当上述任何消息的长度超过 13 时,会发生的情况是,首先显示我发送的消息,然后显示向我发送消息的用户。

消息来自和消息的长度小于13,所以现在很好

enter image description here

当它超过长度13时,首先显示我的消息

enter image description here

然后会向我显示发送给我的用户

enter image description here

数据格式

enter image description here

显示聊天的脚本

var ac_user = data.active_user;
socket.on("get_ret_messages",(data)=>{
       while (chatBody.hasChildNodes()) { chatBody.removeChild(chatBody.firstChild); }

       for(let i = 0; i<data.length;i++){
          	 	if(data[i].mess_to == ac_user){
              	 	mess = '<div class="bubble you">'+data[i].mess_txt+'<br><span class="time">'+data[i].mess_time+'</span></div>';
          	        chatBody.insertAdjacentHTML("beforeend",mess);
              	 }
              	 else{
              	 	 mess = '<div class="bubble me">'+data[i].mess_txt+'<br><span class="time">'+data[i].mess_time+'</span></div>';
	          	     chatBody.insertAdjacentHTML("beforeend",mess);
	          	 }
          	}

          	chatBody.scrollTop = chatBody.scrollHeight;

          });

查询

socket.on("get_user_messages",(data)=>{
  		  var GET_CLICKED_USER_MESS = "SELECT mess_txt,mess_time,mess_to FROM (select mess_to as user_id,mess_txt,mess_time,mess_id,mess_to from messages where mess_from = '"+data.active+"' AND mess_to='"+data.clicked+"' UNION select mess_to as user_id,mess_txt,mess_time,mess_id,mess_to from messages where mess_from = '"+data.clicked+"' AND mess_to='"+data.active+"' ORDER BY mess_id ASC) sq join users on users.id = sq.user_id";
          con.query(GET_CLICKED_USER_MESS,(err,res)=>{
             if(err) throw err;
             socket.emit("get_ret_messages",res);
          })
       });

  

我很确定问题可以在查询中,但我不知道那是什么。

1 个答案:

答案 0 :(得分:1)

对于一点点解释:ORDER BY必须放在最后才能生效,否则它将按顺序查询子查询,订单可能被{{1}弄乱了}

查询:

JOIN