不知道这是否可行,我正在寻找一个编写社交网络的代码,但需要一些帮助。
SELECT wall.Wid, wall.uid, wall.wcomment, wall.name, comment.wid, comment.comment,comment.wid
FROM wall
LEFT JOIN comment ON wall.Wid=comment.wid
WHERE wall.uid in (SELECT fid from friends where uid = 3)
干杯球员
答案 0 :(得分:0)
扩大答案:
在SQL中实际上并不容易,特别是不限制墙帖和评论。你可能最好在循环中执行此操作,检索x墙贴,然后检索y评论。这样你就可以缓存每个帖子的评论,并且每次都保存检索它们。
你可以像这样限制墙贴的数量:
SELECT wall.Wid, wall.uid, wall.wcomment, wall.name, comment.wid, comment.comment, comment.wid
FROM wall LEFT JOIN comment ON wall.Wid=comment.wid
WHERE wall.Wid in (SELECT Wid FROM wall WHERE wall.uid IN (SELECT fid from friends where uid = 3) LIMIT 0, 10)
请记住,这是非常低效的,因为对于每个评论,您将检索墙贴,所以如果墙贴有10条评论,您将获得墙贴数据10次,每次都有不同的评论。我建议你在缓存循环中进行。
答案 1 :(得分:0)
我是一个可怜的MSSQL人,所以我推断一些人可以在MySQL中使用......
SELECT
wall.Wid,
wall.uid,
wall.wcomment,
wall.name,
comment.id,
comment.comment,
comment.wid
FROM
wall
LEFT JOIN
comment
ON comment.id IN (SELECT id FROM comment WHERE wid = wall.wid ORDER BY id DESC LIMIT 4)
WHERE
wall.uid IN (SELECT fid from friends where uid = 3)
AND wall.Wid IN (SELECT Wid FROM wall ORDER BY Wid DESC LIMIT 30)
注意:MSSQL Server现在非常擅长优化IN条件以执行和连接一样好。我不知道MySQL在这方面的表现。
修改强>
如果您不能以这种方式使用LIMIT,那么您似乎被迫编写一个获取所有注释的查询,但随后添加一些条件以消除您不想要的那些。这似乎涉及为每个评论计算一个“行号”,我只能想到以某种方式做的事情,这可能不是特别有效......
SELECT
wall.Wid,
wall.uid,
wall.wcomment,
wall.name,
comment.id,
comment.comment,
comment.wid
FROM
wall
LEFT JOIN
comment
ON comment.wid = wall.wid
AND 4 >= (
SELECT
COUNT(*)
FROM
comment AS [newer_comment]
WHERE
[newer_comment].wid = comment.wid
AND [newer_comment].date_added > comment.date_added
)
WHERE
wall.uid IN (SELECT fid from friends where uid = 3)
AND 30 >= (
SELECT
COUNT(*)
FROM
wall AS [newer_wall]
WHERE
[newer_wall].uid IN (SELECT fid from friends where uid = 3)
AND [newer_wall].date_added > wall.date_added
)
注意:我在[wall]和[comment]表中添加了[date_added]字段,用于确定选择“前30个”记录的顺序......
为了实现远程高效,必须添加索引以尽可能快地进行COUNT(*)子查询。
有一个决赛(更复杂,但可能更智能,更高效,我可以在今天晚些时候总结,但我现在必须重新开始工作。如果这适用于你,我会发布'更好'的版本)