MySQL按计数限制并返回具有相同日期的项目

时间:2013-05-02 18:49:51

标签: mysql sql

假设我有以下表结构

CREATE TABLE `calendar` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `date` DATE NOT NULL,
  PRIMARY KEY (`id`)
)

以下数据

INSERT INTO `calendar` (`title`, `date`)
VALUES ('Day 1 - Event 1', '2013-05-01'),
('Day 2 - Event 1', '2013-05-02'),
('Day 2 - Event 2', '2013-05-02'),
('Day 3 - Event 1', '2013-05-03');

我希望将结果集限制为2个项目,但不能在同一日期的项目之间剪切结果。

SELECT *
FROM `calendar`
WHERE `date` >= '2013-05-01'
LIMIT 2

产量

('Day 1 - Event 1', '2013-05-01'),
('Day 2 - Event 1', '2013-05-02'),
('Day 2 - Event 2', '2013-05-02')

而不仅仅是

('Day 1 - Event 1', '2013-05-01'),
('Day 2 - Event 1', '2013-05-02')

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

这样的事情应该可以将你想要的日期放在子查询中:

SELECT DISTINCT c.* 
FROM `calendar` c
  JOIN (
       SELECT `date`
       FROM `calendar`
       WHERE `date` >= '2013-05-01'
       LIMIT 2
    ) c2 on c.`date` = c2.`date`

SQL Fiddle Demo

我建议您在查询中添加ORDER BY日期,但不能保证结果的顺序。

答案 1 :(得分:1)

如果我理解正确,你想要显示前两个项目,但如果最后一个项目上有一个平局(在日期),也要包括绑定结果。 SQL-Server有TOP (2) WITH TIES但不幸的是MySQL的LIMIT没有等价物。因此,查询必须更复杂:

SELECT *
FROM calendar
WHERE `date` >= '2013-05-01'
  AND `date` <= COALESCE(
       ( SELECT `date`
         FROM calendar
         WHERE `date` >= '2013-05-01'
         ORDER BY `date`
           LIMIT 1 
           OFFSET 1                          -- that's 2 minus 1
       ), '9999-12-31'  )
  ;

另一种方式,类似于@ sgeddes的回答:

SELECT c.* 
FROM calendar c
  JOIN 
    ( SELECT DISTINCT `date`
      FROM
        ( SELECT `date`
          FROM `calendar`
          WHERE `date` >= '2013-05-01'
          ORDER BY `date`
            LIMIT 2
        ) AS c2
    ) AS cc 
      ON c.`date` = cc.`date` ;

答案 2 :(得分:-1)

您可以使用DISTINCT子句。

SELECT DISTINCT(DATE),attrib2,attrib3,......
FROM `calendar`
WHERE `date` >= '2013-05-01'
LIMIT 2