MySQL - 限制连接中的行数?

Posted

技术标签:

【中文标题】MySQL - 限制连接中的行数?【英文标题】:MySQL - Limit the amount of rows in a join? 【发布时间】:2010-02-03 02:32:01 【问题描述】:

不确定 在这里寻找一些指导...

我有以下表格:

site_text
id   site_id    text    date_added
1    1          ...     2010-02-02 10:01:00
2    1          ...     2010-02-02 10:01:20
3    2          ...     2010-02-02 10:01:00
4    1          ...     2010-02-02 10:01:40
5    2          ...     2010-02-02 10:02:00

sites
id   site_name
1    www.a.com
2    www.b.com
....

我正在尝试在每个站点的 site_text 中选择最后 2 行(按日期顺序排列)。你可以用一个查询来做到这一点吗?类似的东西,但它只能找到每个站点的 2 行吗?

SELECT * 
  FROM site_text st 
  JOIN sites s ON st.site_id = s.id 
 WHERE st.date_added > '2010-02-01 23:32:04' 
ORDER BY s.id, st.date_added DESC

编辑:最后,我会寻找第 4、2、5、3 行。

【问题讨论】:

我不明白你期望的输出。 【参考方案1】:

这里有一个巧妙的解决方案,使用 CTE 和 Pg 8.4 中的 RANK() OVER DATE_ADDED,但因为您使用的是 mysql,所以我能想到的唯一一件事涉及计算非常复杂的查询:

-- Select the top date for each site_id
SELECT DISTINCT id FROM site_text
    GROUP BY site_id, date_added
    ORDER BY site_id, date_added
UNION
-- Select the top date for each site_id
SELECT DISTINCT id FROM site_text
    GROUP BY site_id, date_added
        -- Excluding the top date.
    WHERE id NOT IN (
        SELECT DISTINCT id FROM site_text
        GROUP BY site_id, date_added
        ORDER BY site_id, date_added
    )
    ORDER BY site_id, date_added
;

故事的寓意,使用 Pg。可能有一种更特定于 mysql 的方法来执行此操作,从而产生更可接受的性能配置文件。

【讨论】:

哇,太贵了。感谢您的提示。我一直想看看PG有一段时间了。也许这就是原因! 小子,你是来请客的:就像从一个吸吮隧道中出来一样。 有一个窗口函数,仅供参考,我认为它看起来像这样SELECT * FROM ( SELECT text, date_added, rank() OVER ( PARTITION BY site_id ORDER BY date_added desc ) AS t WHERE t.rank IN (1,2),我希望它的运行速度快>100倍。

以上是关于MySQL - 限制连接中的行数?的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 限制 textarea 中的行数和显示行数

限制号mongodb 输入中的行数

严格限制 textarea Angular 中的行数

限制文本区域中的行数

如何限制查询中返回的组数,而不是 Oracle 中的行数

MySQL通过触发器解决数据库中表的行数限制的需求