使用连接限制结果而不计算连接结果?

时间:2010-05-25 07:10:30

标签: sql mysql database

不知道这是否可行,我正在寻找一个编写社交网络的代码,但需要一些帮助。

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) 

干杯球员

2 个答案:

答案 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(*)子查询。

有一个决赛(更复杂,但可能更智能,更高效,我可以在今天晚些时候总结,但我现在必须重新开始工作。如果这适用于你,我会发布'更好'的版本)