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

问题描述:

不知道这是否可能,我正在寻找一个写社交网络的代码,但需要一些帮助。使用连接限制结果而不计入连接结果?

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

这里有什么问题? :) – oedo 2010-05-25 07:13:54

+0

嘿队友 - 我想选择让我说我的墙30结果,但然后拉所有他们的所有意见,但是,如果我只是使用限制,它将所有评论作为墙帖(内部加入评论) – Matt 2010-05-25 07:18:12

+0

做你的意思是评论意见? – 2010-05-25 07:25:38

扩大为答案:

它实际上不是容易在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,所以我推断somethign likethis将在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现在是非常好的,就像执行以及加入。我不知道MySQL在这方面的表现。

编辑:

如果你不能使用这种方式的限制,那么你似乎是被迫写一个查询,得到所有的意见,但再加入一些条件,以消除那些你不要。这似乎涉及calulating为每个评论,我只能想以某种方式做的“行号”,这可能不是特别有效......

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 
      ) 

注:我添加了一个[date_added]字段添加到[wall]和[comment]表格中,用于确定您选择“前30条”记录的顺序...

为了实现这种效率,必须添加索引以尽可能快地创建COUNT(*)子查询。

有一个最终的(更复杂的,但可能更智能和高效的版本,我今天晚些时候可以申请,但我现在必须重新开始工作,如果这对你有用,我会发布'更好'的版本)

+0

不存在:(mysql不允许内部限制 – Matt 2010-05-25 08:58:03