如何编写一个“平衡”的sql select查询

时间:2013-05-31 21:47:32

标签: mysql sql

请原谅我这个问题的标题是不清楚的,因为我正在努力寻找我正在寻找的名字。因此,请在我解释时请耐心等待:

假设我有以下表格:

现在假设feeds表中有5个条目:

the great splog每天发布100篇帖子

unknown blog 1unknown blog 4每天发布1或2个帖子

我们将定期提取这些Feed并将其帖子保存在posts表格中。

但是,如果我select来自posts表的最后10个条目,那么所有10个帖子都很有可能属于the great splog,仅仅是因为它今天发布了更多帖子比其他4个不知名的人。

但我不希望来自同一Feed的10个帖子,我希望select查询能够理解这种情况并选择 - 例如 - 只有2个条目由the great splog和8编写由posts表格中的其他未知博客撰写的条目。

如何实施此类查询?

2 个答案:

答案 0 :(得分:1)

采取3种不同的,另外7种:

(SELECT * FROM posts WHERE post_id IN (SELECT MAX(post_id) FROM posts GROUP BY post_feed_id) ORDER BY post_id DESC LIMIT 3)
UNION
(SELECT * FROM posts ORDER BY post_id DESC LIMIT 7)
ORDER BY post_id DESC

<强>更新 上面的代码只给出9,所以做一些更多的封装来限制正确的地方。

SELECT * FROM 
(
    SELECT * FROM 
    (
        (
            SELECT * FROM posts WHERE post_id IN (
                SELECT MAX(post_id) FROM posts GROUP BY post_feed_id
                ) ORDER BY post_id DESC LIMIT 3
        )
        UNION
        (
            SELECT * FROM posts ORDER BY post_id DESC
        )
    ) AS temp LIMIT 10
) AS temp2 ORDER BY post_id DESC;

答案 1 :(得分:1)

您可以使用以下声明从每个Feed中获取最后一篇文章:

select p.*
from posts p join
     (select p.post_feed_id, max(p.post_id) as maxpi
      from posts p
      group by p.post_feed_id
     ) pf
     on p.post_id = pf.maxpi;

在考虑获得多个之前,您必须考虑如何在Feed中分配它们。