[英]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.