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

如何编写一个MySQL查询,在条件下搜索两个表中的数据?,mysql,sql,Mysql,Sql,我想在网站上做一个搜索栏,搜索收件箱;我在搜索栏中键入时搜索发件人姓名和消息,搜索结果显示用户名及其个人资料图片和消息。就像WhatsApp搜索栏一样,您可以在其中搜索任何发件人姓名和任何消息 为此,我有两张桌子。第一个名称是user,第二个表名是inbox。两者都具有柱状结构: 用户-uid、姓名、姓氏、个人资料图片、地址、出生日期 收件箱-id、msg\u to、msg\u from、msg、time、latestmsg,已打开 我想从两个表中搜索可以是任何用户名,也可以是任何消息字的数据。

我想在网站上做一个搜索栏,搜索收件箱;我在搜索栏中键入时搜索发件人姓名和消息,搜索结果显示用户名及其个人资料图片和消息。就像WhatsApp搜索栏一样,您可以在其中搜索任何发件人姓名和任何消息

为此,我有两张桌子。第一个名称是
user
,第二个表名是
inbox
。两者都具有柱状结构:

用户-uid、姓名、姓氏、个人资料图片、地址、出生日期

收件箱-id、msg\u to、msg\u from、msg、time、latestmsg,已打开

我想从两个表中搜索可以是任何用户名,也可以是任何消息字的数据。 那么,这个查询设计应该如何呢

我以以下方式设计了一个查询:

 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和任何聊天系统一样)是:

乍一看

不应使用基于隐式联接的旧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 withut aggreation函数会产生错误,而在其他版本中会产生不可预测的结果)

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

您也不应该在sql中使用PHPVAR,因为您面临SQLInjection的风险
您应该查看php db驱动程序中的prepared语句和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

这是一个反问句吗?是的,但建议也很受欢迎,因为这是一个理论问题,我更喜欢将两个表内部连接起来,然后使用where子句。那么就很容易理解了。你想用“%$search%”之类的
u.uid=i.msg\u做什么?
(u.uid=i.msg\u from或u.uid=i.msg\u to)和(i.msg\u to='uid'或i.msg\u from='uid')
这是显示两个表中数据的一个条件,我想问一下我是否将“%$search%”之类的
放在了正确的位置;因为搜索内容没有随此查询一起显示。我按照您所说的方式实现了它,但检查结果中仍然没有显示搜索内容。。您应该更新您的问题并添加适当的数据样本。。以及预期结果。好的,我现在已经添加了详细信息。我要求提供数据样本。。但是我没有看到这些信息…asnwer更新了一个简化版本,以查看join的正确用法
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