2010-05-25 67 views
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) 

乾杯傢伙

+0

這裏有什麼問題? :) – oedo 2010-05-25 07:13:54

+0

嘿隊友 - 我想選擇讓我說我的牆30結果,但然後拉所有他們的所有意見,但是,如果我只是使用限制,它將所有評論作爲牆帖(內部加入評論) – Matt 2010-05-25 07:18:12

+0

做你的意思是評論意見? – 2010-05-25 07:25:38

回答

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次牆上貼文數據,每次有不同的評論。我建議你在循環中進行緩存。

0

我是一個卑鄙的人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