假设我有以下表结构
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')
有什么想法吗?
答案 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`
我建议您在查询中添加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