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 - 限制连接中的行数?的主要内容,如果未能解决你的问题,请参考以下文章