2012-03-11 59 views
0

上下文檢索n行:MySQL的 - 計數以及從子查詢

  • 我有一個應用程序,顯示在主頁上的帖子和評論。
  • 我的目的是限制顯示職位(即10個)的
  • 限制每個職位(即2條評論)顯示評論數的數量和...。
  • 顯示在前端(即「閱讀所有10條評論」)的評論總數

的MySQL:

(SELECT * 
FROM (SELECT * 
     FROM post 
     ORDER BY post_timestamp DESC 
     LIMIT 0, 10) AS p 
     JOIN user_profiles 
      ON user_id = p.post_author_id 
     LEFT JOIN (SELECT * 
        FROM data 
          JOIN pts 
          ON pts_id = pts_id_fk) AS d 
      ON d.data_id = p.data_id_fk 
     LEFT JOIN (SELECT * 
        FROM comment 
          JOIN user_profiles 
          ON user_id = comment_author_id 
        ORDER BY comment_id ASC) AS c 
      ON p.post_id = c.post_id_fk)) 

我沒在這個代碼中插入LIMITCOUNT得到我想要的 - 有什麼建議? - 如果需要,將很高興發佈更多信息。

+0

請顯示您的架構。對非工作查詢進行反向工程很困難。 – 2012-03-11 03:52:45

回答

0

如果我正確地理解了你,你希望返回結果集中的每個唯一用戶不超過10個帖子(和2個評論)。

這在SQLServer/Oracle/Postgre中使用「row_number()PARTITION BY」非常簡單。

不幸的是在MySql中沒有這樣的功能。類似的問題已經在這裏問:
ROW_NUMBER() in MySQL

對不起,我不能提供一個更具體的MySql解決方案。絕對會進一步研究MySql的「行號分區」。

的這是什麼一樣的精髓:

您可以添加一組構成了一個獨特的列集,例如說爲了用戶ID(這是「分區」)「行數字「列將被添加到與分區匹配的每一行,並在其更改時重新開始。

這應該說明:

user_id row_number 
1  1 
1  2 
1  3 
2  1 
2  2 

然後,您可以添加,說外部查詢:選擇ROW_NUMBER < = 10,它可以在你的情況下被用來限制在不超過10個職位。使用該用戶的最大row_number來確定「讀取全部10條評論」部分。

祝你好運!

0

這是查詢的您正在尋找的骨架:

select * from (
    select p1.id from posts p1 
    join posts p2 on p1.id <= p2.id 
    group by p1.id 
    having count(*) <= 3 
    order by p1.post_timestamp desc 
) p left join (
    select c1.id, c2.post_id from comments c1 
    join comments c2 on c1.id <= c2.id and c1.post_id = c2.post_id 
    group by c1.id 
    having count(*) <= 2 
    order by c1.comment_timestamp desc 
) c 
on p.id = c.post_id 

它會得到發貼的下降時間戳下令但只有其中的前3名。該結果將通過降序時間戳與每個帖子的前2條評論結合起來。只需更改列名稱,它將工作:)