MySQL 按总和限制行数
Posted
技术标签:
【中文标题】MySQL 按总和限制行数【英文标题】:MySQL Limit rows by sum 【发布时间】:2015-07-28 09:37:50 【问题描述】:我希望进行选择并将未来和以前的事件数量限制为 20,例如,首先针对最新事件。
future_events
和 previous_event
是 1 或 0。如果需要,我可以将其存储为单列。
我想我错过了一个 GROUP BY,但今天早上我的脑子里没有它。这就是我所拥有的:
SELECT name, start_timestamp, end_timestamp, future_event, previous_event, url
FROM events_table
WHERE status != 'draft' AND status != 'canceled'
-- AND SUM(previous_event) <= 20
-- AND SUM(future_event) <= 20
ORDER BY start_timestamp DESC
-- Sample Table
CREATE TABLE IF NOT EXISTS `events_table` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`url` varchar(500) NOT NULL,
`start_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`end_timestamp` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`status` varchar(10) NOT NULL,
`future_event` tinyint(1) NOT NULL,
`previous_event` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-- Data
-- Each row is an event with a unique event, time, url etc.
预期结果
总共返回最多 40 个结果 最多 20 个未来事件(其中future_event
= 1)
最多 20 个以前的事件(其中 previous_event
= 1)
仅显示最近的事件
【问题讨论】:
你可能想使用 HAVING 子句:techonthenet.com/mysql/having.php 谢谢,我会再试一次! 这样看 WHERE 是预聚合过滤,即逐行 HAVING 是聚合后过滤,指的是 GROUPS 请提供样本数据和期望的结果。我不清楚你在问什么。 @GordonLinoff 我已更新以提供更多信息 【参考方案1】:您可以使用 UNION 并执行两个请求:
((SELECT `name`,
start_timestamp,
end_timestamp,
future_event,
previous_event, url
FROM events_table
WHERE STATUS != 'draft'
AND STATUS != 'canceled'
and future_event = 1
ORDER BY start_timestamp DESC limit 20)
UNION
(SELECT `name`,
start_timestamp,
end_timestamp,
future_event,
previous_event,
url
FROM events_table
WHERE STATUS != 'draft'
AND STATUS != 'canceled'
and previous_event = 1
ORDER BY start_timestamp DESC limit 20))
【讨论】:
【参考方案2】:您可以按照以下方式使用-
SELECT a.* FROM ((SELECT `name`, start_timestamp, end_timestamp, future_event, previous_event, url
FROM events_table
WHERE STATUS != 'draft' AND STATUS != 'canceled' AND previous_event = 1
ORDER BY start_timestamp DESC LIMIT 20)
UNION
(SELECT `name`, start_timestamp, end_timestamp, future_event, previous_event, url
FROM events_table
WHERE STATUS != 'draft' AND STATUS != 'canceled' AND previous_event = 1
ORDER BY start_timestamp DESC LIMIT 20)) a ORDER BY start_timestamp DESC;
【讨论】:
为什么只对名字进行分组?它似乎不起作用,因为它似乎检查每一行 if 1 假设将有多行 previous/future_event 针对名称。如果不是这种情况,请显示您的表格数据以及您需要的结果。 尝试添加更多信息。干杯 我不能说这是最好的解决方案,但你可以通过这个得到你想要的结果。以上是关于MySQL 按总和限制行数的主要内容,如果未能解决你的问题,请参考以下文章