繁体   English   中英

少于运算符给出奇怪的结果

[英]Less than operator giving weird results

所以我有这个查询将几个表连接在一起并返回数据

SELECT * FROM userposts up
INNER JOIN userpostmeta upm
ON up.up_postID = upm.upm_postID
INNER JOIN userbasicprofile ubp
ON up.up_userID = ubp.ubp_userID
WHERE up.up_userID = :self OR up.up_userID IN (SELECT ufs_userID2 FROM userfriends where ufs_userID1 = :u)
AND
up.up_indexid < $startIndex AND up.up_indexid > 0
ORDER BY up.up_indexid DESC
LIMIT $limit

表格userposts有一个名为'up_indexid'的列,它是AUTO INCREMENT

问题是 ,当我为支持31发送$startIndex的值时,它显示indexid 31以下的indexid ,但也显示其上方的帖子。

为什么会这样呢? 我已经尝试了多个断点,但是似乎没有任何解决方案。

原因与<无关,这是由于您的mysql查询中包含OR

SELECT * FROM userposts up
INNER JOIN userpostmeta upm
ON up.up_postID = upm.upm_postID
INNER JOIN userbasicprofile ubp
ON up.up_userID = ubp.ubp_userID
WHERE up.up_userID = :self 
OR up.up_userID #OR makes things unexpected
  IN (SELECT ufs_userID2 FROM userfriends where ufs_userID1 = :u) 
AND
up.up_indexid < $startIndex AND up.up_indexid > 0
ORDER BY up.up_indexid DESC
LIMIT $limit

尝试这样做:

'SELECT * FROM userposts up
INNER JOIN userpostmeta upm
ON up.up_postID = upm.upm_postID
INNER JOIN userbasicprofile ubp
ON up.up_userID = ubp.ubp_userID
WHERE up.up_userID = :self OR up.up_userID IN (SELECT ufs_userID2 FROM userfriends where ufs_userID1 = :u)
AND
up.up_indexid < ' . intval($startIndex) . ' AND up.up_indexid > 0
ORDER BY up.up_indexid DESC
LIMIT ' . intval($limit)

我注意到您正在使用Binding和字符串中的变量,为什么不只绑定startIndex并限制呢? 另外,您可能想看一下偏移量,这可能是一个更好的解决方案,例如LIMIT 100,10(所以从第10个条目开始有100个条目)

根据https://dev.mysql.com/doc/refman/8.0/en/operator-precedence.html OR的优先级低于AND,因此您的WHERE子句解释为:

WHERE up.up_userID = :self OR (up.up_userID IN (SELECT ufs_userID2 FROM userfriends where ufs_userID1 = :u)
AND
up.up_indexid < $startIndex AND up.up_indexid > 0)
ORDER BY up.up_indexid DESC
LIMIT $limit

我想您想要的是以下内容:

WHERE (up.up_userID = :self OR up.up_userID IN (SELECT ufs_userID2 FROM userfriends where ufs_userID1 = :u))
AND
up.up_indexid < $startIndex AND up.up_indexid > 0
ORDER BY up.up_indexid DESC
LIMIT $limit

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM