mysql - 如何编写一个 MySQL 查询在条件下搜索两个表中的数据?
问题描述
我想在收件箱的网站上制作一个搜索栏;搜索发件人姓名和消息,因为我在搜索栏中键入显示用户名及其个人资料图片和消息的结果。就像 WhatsApp 搜索栏一样,您可以在其中搜索任何发件人姓名和任何消息。
为此,我有两张桌子。第一个名称是user
,第二个表名称是inbox
。两者都有如下列:
user - uid,name,lastname,profile_pic,address,dob
.
inbox - id,msg_to,msg_from,msg,time,latestmsg,opened
.
我想从两个表中搜索可以是任何用户名并且可以是任何消息单词的数据。那么,这个查询设计应该如何呢?
我通过以下方式设计了一个查询:
SELECT u.name
, u.lastname
, u.profile_pic
, i.msg_from
,i.msg_to
, i.msg,i.time
from user
, inbox i
where
(
u.uid=i.msg_from LIKE '%$search%'
OR u.uid=i.msg_to LIKE '%$search%'
)
AND
(
i.msg_to='$uid' LIKE '%$search%'
OR i.msg_from='$uid' LIKE '%$search%'
)
AND u.uid!=$uid
AND latestmsg=1
GROUP
BY i.id DESC
但是,它不起作用。
顺便说一句,在个人资料图片旁边显示用户名和消息的查询(就像 WhatsApp 和任何聊天系统一样)是:
SELECT u.name,
u.lastname,
u.profile_pic,
i.msg_from,
i.msg_to,
i.msg,
i.time
FROM user u,
inbox i
WHERE (u.uid=i.msg_from
OR u.uid=i.msg_to)
AND (i.msg_to='$uid'
OR i.msg_from='$uid')
AND u.uid!=$uid
AND latestmsg=1
GROUP BY i.id DESC
解决方案
乍一看
您不应使用基于隐式连接的旧 sintax,而应使用显式 sintax
SELECT distinct u.name
,u.lastname
,u.profile_pic
,i.msg_from
,i.msg_to
,i.msg,i.time
from comnet_user_details u
INNER JOIN comnet_inbox i ON
(u.uid=i.msg_from LIKE '%$search%' OR u.uid=i.msg_to LIKE '%$search%')
AND
(i.msg_to='$uid' LIKE '%$search%' OR i.msg_from='$uid' LIKE '%$search%')
AND
u.uid!=$uid AND latestmsg=1
ORDER BY i.id DESC";
如果你不使用聚合函数,你不应该使用 group by,你应该使用 DISTINCT(在最近的 mysql 版本中,使用 group by 没有聚合函数会产生错误,而在其他版本中会产生不可预测的结果)
可能是您正在寻找 ORDER BY DESC
您也不应该在 sql 中使用 PHP var,您有 sqlinjecttion 的风险,
您应该查看您的 php db 驱动程序以获取准备好的语句和 bindig 参数
这是一个简化版本,让您看到(可能)正确使用加入和搜索所涉及的列
SELECT u.name
, u1.lastname lastname_from
, u1.profile_pic profile_pic_from
, u2.lastname lastname_to
, u2.profile_pic profile_pic_to
, i.msg_from
, i.msg_to
, i.msg
, i.time
FROM comnet_inbox
INNER JOIN comnet_user_details u1 ON u1.uid=i.msg_from
INNER JOIN comnet_user_details u2 ON u1.uid=i.msg_to
WHERE i.msg LIKE concat('%', $search,'%')
ORDER BY i.id DESC
推荐阅读
- javascript - 无法写入内容:无法延迟初始化角色集合,无法初始化代理 - 无会话
- excel - 403 禁止在 OneDrive 中读取 CSV 文件
- java - Apache Spark :org.apache.spark.sql.Dataset.drop(String... colNames) 方法用于 Java
- android - 选择 DatePickerDialog 时,对话框 onCreateDialog 显示错误
- php - Drupal 8.5.1 升级错误 - 在哪里寻找故障排除?
- mysql - 如何在 Fluent Vapor 3 中按动态列排序
- java - Android 拍照并保存到外部存储
- vue.js - Vue.js 绑定列表中每个项目的样式(类)与 v-for 依赖于项目数据
- java - 打印源文件的当前内容(在 Android 上使用 Java 或 Kotlin)
- android - 上传/下载特定文件到/从网络服务器到手机android工作室