如何从两个具有一对多关系的表中获取联接数据?

时间:2015-09-02 14:07:30

标签: mysql sql select join

我有以下两个表:

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'

但我不知道如何为一对多的关系制作它,同时还要考虑每次旅行的统计数量。

1 个答案:

答案 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的行。