在条件下如何编写MySQL查询来搜索两个表中的数据?

时间:2019-01-27 07:36:57

标签: php sql mysqli phpmyadmin whatsapp

我想在网站上建立一个收件箱搜索栏;当我在搜索栏中键入显示用户名及其个人资料图片和消息的结果时,搜索发件人名称和消息。就像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

1 个答案:

答案 0 :(得分:2)

乍看之下

您不应使用基于隐式连接的旧正弦波,而应使用显式正弦波

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 withut聚集功能会产生错误,而在其他版本中会产生不可预测的结果)< / p>

可能是您正在寻找按DESC订购的订单

您也不应该在sql中使用PHP var,否则有遭受sqlinjection的风险
您应该看看准备好的语句和bindig参数的php db驱动程序

这是一个简化版本,可让您(正确)正确使用联接和搜索中涉及的列

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