javascript - mySQL查询在相同条件下检索数据不同

标签 javascript mysql for-loop socket.io

我在 Node-JS 和 Socket.io 中使用 MySQL 数据库制作了一个聊天应用程序。我已经完成了一切,但陷入了一件我无法解决的事情。当用户登录其帐户时,他们会被重定向到收件箱,然后显示与他聊天的用户列表。例如,当前登录的用户是 John,当 John 点击 Doe 时,他与一个名为 Doe 的人聊天> 从列表中的名称打开聊天,此时所有消息都会从数据库中检索。数据作为对象数组存储在变量data中。我在代码中所做的就是循环访问此数据并将每条消息附加到聊天框。显示所有消息的地方。每条消息都有两个类别Message ToMessage From。这些类别是为了区分谁给谁发短信。然后我更改这些消息的背景颜色。从我这边发送的消息将具有灰色背景,向我发送消息的人将具有蓝色背景。

现在我面临的基本问题是,当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);
          })
       });

I am quite sure that the problem can be in the query, but I don't know what is that.

最佳答案

稍微解释一下:ORDER BY必须放在最后才有效,否则它只会对子查询进行排序,并且顺序可能被加入

查询:

"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+"') sq JOIN users ON users.id = sq.user_id ORDER BY mess_time ASC"

关于javascript - mySQL查询在相同条件下检索数据不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46969845/

相关文章:

php - 如果 session auth=1 则无法找出回显文本,否则回显文本 2

python - Beautiful Soup Find() 返回 AttributeError

IOS - 限制用户最多选择 8 个图像并使用 For 循环将多个图像上传到 Firebase

javascript - React 中复杂状态的深度合并

javascript - SAPUI5 - 存在异步函数时的路由问题

Javascript:发现选择下拉列表中的选项时会触发什么功能

javascript - 正则表达式非将符号后的字符转换为大写

MySql 数据库与 python 的连接

batch-file - 如何缩短批处理文件中文本文件的文件路径输出

mysql - swi prolog mysql + web