2015-07-28 56 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))