首页 > 解决方案 > 如何编写一个 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

标签: mysqlsql

解决方案


乍一看

您不应使用基于隐式连接的旧 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

推荐阅读