mysql - sql-按平均范围选择第一个表中具有第二个表外键的项目的ID

标签 mysql

我有一个包含两个表的牛棚数据库:

  1. place_of_cow(cow_id, block_id)
  2. cow_details(nickname, cow_id, age) - 牛的月龄

表 place_of_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
);

我插入的值是:

INSERT INTO place_of_cow
VALUES (1, 1), (1, 5), (1, 6), (2, 2), (2, 7), (3, 3), (4, 4), (4, 8), (4, 9);

表 cow_details 是这样创建的:

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 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);

我正在尝试显示表 place_of_cow 中的所有 block_id,其中每个 block_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
);

但结果是:

方 block 编号:
1
2
3

block_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_id 而不是 cow_id 进行分组,因为聚合必须针对 block 而不是奶牛进行。

Fiddle

关于mysql - sql-按平均范围选择第一个表中具有第二个表外键的项目的ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23594538/

相关文章:

sql - sql查询的问题

php - 从大于单页的动态创建的表格 (div) 创建多页 PDF

mysql - SQL按最接近时间合并2个表

PHP 意外的输入结束错误

php - 来自外部 php 文件的 CRUD

java - 如何从客户端服务器程序中的服务器控制台获取输入

PHP PDO INSERT WHERE NOT EXISTS 语句不起作用

用于运行存储过程的 MySQL 唯一 session

java - MySQL每次都打开一个新的Statement?

mysql - 在 mySQL 中将字符串值转换为日期/日期时间