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