我有以下两个表:
CREATE TABLE IF NOT EXISTS `myDB`.`trips` (
`IdTrip` INT NOT NULL AUTO_INCREMENT ,
`IsCancelled` TINYINT NULL DEFAULT 0 ,
PRIMARY KEY (`IdTrip`) );
CREATE TABLE IF NOT EXISTS `myDB`.`stats` (
`IdStat` INT NOT NULL AUTO_INCREMENT ,
`IdTrip` INT NOT NULL ,
`DateStat` DATE NULL ,
PRIMARY KEY (`IdStat`) ,
INDEX `fk_trips_stats_idx` (`IdTrip` ASC) ,
CONSTRAINT `fk_trips_stats`
FOREIGN KEY (`IdTrip` )
REFERENCES `myDB`.`trip` (`IdTrip` )
ON DELETE RESTRICT
ON UPDATE RESTRICT);
这种关系是一对多的:一次旅行可能有不同的统计数据。
现在,我想显示stats
到'2015-05-01'
期间'2015-05-25'
期间(由DateStat定义)有超过1个条目的旅行的所有信息。
如果存在一对一的关系,那么我会以这种方式检查日期:
DateStat BETWEEN '2015-05-01' AND '2015-05-25'
但我不知道如何为一对多的关系制作它,同时还要考虑每次旅行的统计数量。
答案 0 :(得分:3)
使用GROUP BY
的简单HAVING
就足够了:
SELECT
trips.IdTrip
,trips.IsCancelled
FROM
trips
INNER JOIN stats ON stats.IdTrip = trips.IdTrip
WHERE
stats.DateStat >= '2015-09-01 00:00:00'
AND stats.DateStat < '2015-09-26 00:00:00'
GROUP BY
trips.IdTrip
,trips.IsCancelled
HAVING COUNT(*) > 1
以下是SQL Fiddle与您的示例数据。我将查询中的日期范围更改为9月,以包含您的示例数据。如果您在问题中将查询中的日期范围设置为May,则查询将不返回任何行,因为数据中现在存在May的行。