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