2015-07-28 59 views
3

我希望做一个select,并将未来事件和先前事件的数量限制在20以上,例如对于最先的事件。MySQL按总和限制行数

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)
  • 只显示最近的事件
+2

你可能想使用HAVING子句:http://www.techonthenet.com /mysql/having.php –

+0

谢谢,我会再试一次! – ptimson

+0

这样看待WHERE是预聚合过滤,即逐行HAVING是后聚合过滤,参考GROUPS – Mihai

回答

0

您可以使用按如下─

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; 
+0

为什么你只有分组名称?它似乎没有工作,因为如果1 <20而不是所有的SUM都检查每行,并且显示第一个19 – ptimson

+0

假设将有多行previous/future_event对名称,那么检查每行。如果不是这种情况,那么显示你的表格数据和你需要的结果。 –

+0

试图添加更多信息。干杯 – ptimson

0

您可以使用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))