我的网站上有一个与Facebook非常相似的系统,您可以在其中发布状态,您的人员可以评论您的状态,等等。这些都以下列格式插入数据库,如果父级状态被删除,设置了喜欢的子表和带有外键的注释,喜欢和评论将被删除。
我还有一个朋友表,其中包含启动朋友请求的用户的用户ID,必须接受或拒绝的用户的用户ID,以及记录的状态,是否&#39 ; s被接受,被拒绝或待决。
还有一个"用户"包含正常malarkey的表,例如电子邮件,密码等。但是,在" userID"列中,所有记录都有唯一的ID。
我现在的查询会加载所有状态,无论状态所有者是否是您的朋友。 当前查询看起来像这样(我在ColdFusion中工作,因此##
是传递给函数的变量)
SELECT *,
(SELECT COUNT(*) FROM status_likes WHERE likeStatusID=statusID) AS StatusLikeCount,
(SELECT COUNT(*) FROM status_comments WHERE SID=statusID) AS StatusCommentCount
FROM status, users
WHERE statusOwner=userID
AND statusType='user'
ORDER BY statusDateTime DESC
LIMIT #args.indexStart#,#args.indexEnd#;
如果状态的所有者是您的朋友,我需要此查询才能加载状态。我可以调用查询来加载用户朋友并附加包含所有朋友的用户ID的字符串,例如:" 652,235,485,975"等
我尝试在查询中执行IN
,因此还有一行:
AND (statusOwner=#val(args.userID)# OR statusOwner IN (#usersFriendsString#))
然而,这会带来重复的结果,当我在状态所有者上尝试GROUP BY
时,它并没有带回它应该拥有的记录。
那里的任何MySQL专家能够提供帮助吗?
答案 0 :(得分:0)
你应该使用类似的东西:
SELECT
s.*,
(SELECT COUNT(*) FROM status_likes WHERE likeStatusID=s.statusID) AS StatusLikeCount,
(SELECT COUNT(*) FROM status_comments WHERE SID=s.statusID) AS StatusCommentCount
FROM Users u
JOIN Friend f ON f.friendOwner = u.id
JOIN Status s ON s.statusOwner = f.id
WHERE u.id = <...>
ORDER BY s.statusDateTime DESC
如果不能使用JOIN指令,可以使用WHERE子句。
或者您可以使用由SELECT填充的IN指令来检索所有必需的状态ID。