MySQL 按总和限制行数

Posted

技术标签:

【中文标题】MySQL 按总和限制行数【英文标题】:MySQL Limit rows by sum 【发布时间】:2015-07-28 09:37:50 【问题描述】:

我希望进行选择并将未来和以前的事件数量限制为 20,例如,首先针对最新事件。

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

MySQL - 限制连接中的行数?

db2,oracle,mysql ,sqlserver限制返回的行数

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

限制结果集行数

谁知道Access数据库行数有没有限制?是多少?

MySQL 简单查询