Mysql sql—按平均范围为第二个表选择第一个表中具有外键的项的ID

Mysql sql—按平均范围为第二个表选择第一个表中具有外键的项的ID,mysql,Mysql,我有一个牛棚数据库,它有两个表: 放置牛的位置(牛id、块id) 奶牛详细信息(昵称、奶牛id、年龄)奶牛月龄 _cow的表位置_是这样创建的: CREATE TABLE place_of_cow ( block_id INT NOT NULL, cow_id INT NOT NULL, FOREIGN KEY cow_detailsFK (cow_id) REFERENCES cow_details (cow_id) ON DELETE CA

我有一个牛棚数据库,它有两个表:

  • 放置牛的位置(牛id、块id)
  • 奶牛详细信息(昵称、奶牛id、年龄)奶牛月龄
  • _cow的表位置_是这样创建的:

    CREATE TABLE place_of_cow (
      block_id       INT  NOT NULL,
      cow_id       INT NOT NULL, 
    FOREIGN KEY cow_detailsFK (cow_id)
        REFERENCES cow_details (cow_id)
        ON DELETE CASCADE
        ON UPDATE NO ACTION
    );
    
    CREATE TABLE cow_details (
      cow_id       INT  NOT NULL,
      nickname     CHAR(25) NOT NULL, 
      age          INT NOT NULL,
      CONSTRAINT cow_detailsPK PRIMARY KEY (cow_id)
    );
    
    我插入的值是:

    INSERT INTO place_of_cow
    VALUES (1, 1), (1, 5), (1, 6), (2, 2), (2, 7), (3, 3), (4, 4), (4, 8), (4, 9);
    
    INSERT INTO cow_details 
      (cow_id,nickname,age)
    VALUES
        (1,'hedva',16),
        (2,'tali',16),
        (3,'cow3',14),
        (4,'cow4',9),
        (5,'cow5',16),
        (6,'cow6',7),
        (7,'cow7',4),
        (8,'cow8',5),
        (9,'cow9',9),
        (10,'cow10',7),
        (12,'cow12',3),
        (13,'cow13',1),
        (14,'cow14',1),
        (15,'cow15',20),
        (16,'cow16',22);
    
    表cow_详细信息是这样创建的:

    CREATE TABLE place_of_cow (
      block_id       INT  NOT NULL,
      cow_id       INT NOT NULL, 
    FOREIGN KEY cow_detailsFK (cow_id)
        REFERENCES cow_details (cow_id)
        ON DELETE CASCADE
        ON UPDATE NO ACTION
    );
    
    CREATE TABLE cow_details (
      cow_id       INT  NOT NULL,
      nickname     CHAR(25) NOT NULL, 
      age          INT NOT NULL,
      CONSTRAINT cow_detailsPK PRIMARY KEY (cow_id)
    );
    
    我插入的值是:

    INSERT INTO place_of_cow
    VALUES (1, 1), (1, 5), (1, 6), (2, 2), (2, 7), (3, 3), (4, 4), (4, 8), (4, 9);
    
    INSERT INTO cow_details 
      (cow_id,nickname,age)
    VALUES
        (1,'hedva',16),
        (2,'tali',16),
        (3,'cow3',14),
        (4,'cow4',9),
        (5,'cow5',16),
        (6,'cow6',7),
        (7,'cow7',4),
        (8,'cow8',5),
        (9,'cow9',9),
        (10,'cow10',7),
        (12,'cow12',3),
        (13,'cow13',1),
        (14,'cow14',1),
        (15,'cow15',20),
        (16,'cow16',22);
    
    我试图显示表中的所有区块id,其中每个区块id中的奶牛的平均年龄超过10个月。 我尝试了以下代码:

    select distinct p.block_id from place_of_cow as p
    where exists
    (
    select c.cow_id from cow_details as c where c.cow_id = p.cow_id
    group by c.cow_id having avg(c.age) > 10
    );
    
    但结果是:

    块id:
    1
    2
    3

    块_id 2不应出现在结果中。我做错了什么?

    试试这个:

    select p.block_id
    from place_of_cow p 
    inner join cow_details d on p.cow_id = d.cow_id
    group by p.block_id
    having avg(d.age) > 10
    
    您需要在
    block\u id
    上分组,而不是在
    cow\u id
    上分组,因为必须针对块而不是cow进行聚合


    别担心,你就快到了。