Sql 使用联接限制结果,而不计算联接结果?

Sql 使用联接限制结果,而不计算联接结果?,sql,mysql,database,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) 干杯伙计

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

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) 
干杯伙计们

回答如下:

实际上,在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次,每次使用不同的评论。我建议您使用缓存进行循环。

我是一个垃圾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服务器现在非常擅长在条件下进行优化,以实现与连接一样好的性能。我不知道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(*)子查询尽可能快


有一个最终版本(更复杂,但可能更智能、更高效,我今天晚些时候可以使用,但我现在必须回去工作。如果这个版本对你有效,我会发布那个“更好”的版本)

嘿,伙计-我想从墙上选择30个结果,然后把所有结果的评论都拉出来,但是,如果我只使用limit,它会将所有评论都算作墙贴(内部加入评论),你是说评论上的评论吗?想象一下一个论坛会让它变得更广泛,就像这个例子一样糟糕:比如4chan。每个线程都会显示,比如说最多30个线程,然后每个线程显示3到4条注释。他们是怎么做到的?所以我想做同样的事情,将线程限制在30个,每个线程有4个注释。再次干杯哇,我在回答中看到了“MSSQL”a,并将其与标签进行了转换!我的“答案”已被适当删除:)在编辑我的答案时添加了替代方法