【问题标题】:Primary / foreign key; joining multiple tables using subqueries主/外键;使用子查询连接多个表
【发布时间】:2019-07-16 03:53:58
【问题描述】:

我有一个包含 5 个表格的作业的问题,如下所示。我需要为每项运动编写一个成本最低的查询:

第二列是equipment_name:

我想我需要在子查询中做一堆连接,主键是 id 列,外键是 name_id 列。这是正确的方法吗?

【问题讨论】:

  • 你用的是什么数据库
  • 我使用的是mysql数据库。
  • 什么版本的 MySQL

标签: mysql join subquery


【解决方案1】:

你不需要一堆连接;最低限度,这个问题可以通过 store_equipment_price 和 sports_equipment 表之间的一个连接来解决 - 如果这两个在设备 ID 上连接,那么您将有效地获得可以给出每个商店每项运动的启动成本的行。您需要按运动 ID 和商店 ID 进行分组;不要忘记从商店 A 获得所有装备开始足球可能会更便宜,但通过撕裂 B 开始打高尔夫球可能更便宜 - 尽管我是如何阅读问题的。但是,如果您准备从 A 商店购买手套,从 B 商店购买球拍等,那么我们在求和时甚至不会按商店进行分组,而是会计算出每个组件最便宜的商店,而不是最便宜的商店每项运动的整体。

如果您在结果行上生成了命名商店/运动,那么您将需要更多的连接,但尝试根据可能的最少连接数来获得正确的结果

通过使用分析/窗口函数,这两个查询最终都会变得更容易,但这些都是依赖于数据库的;永远不要在不说明您的数据库供应商是什么的情况下发布 sql 问题,因为很少有纯 ISO SQL 的问题

【讨论】:

  • 感谢您的解释。我会试一试。
【解决方案2】:

您的问题并不完全清楚,我假设您需要找到商店来购买所有运动的每种设备,以便产生最低费用。以下查询将实现这一目标

select s.sports, e.equipment_name, min(sep.price),
(select store_name from stores st where st.id = sep.store_id) store_name
from sports s
join sports_equipment se on s.id = se.sport_id
join equipment e on e.id = se.equipment_id 
join sports_equipment_prices sep on sep.equipment_id = se.equipment_id
group by s.sports, e.equipment_name
order by s.sports, e.equipment_name
;

以下 'create table''insert data' 脚本基于您的屏幕图像

create table sports (
    id     INTEGER PRIMARY KEY AUTOINCREMENT,
    sports varchar(50)
);

insert into sports(sports) values('golf');    
insert into sports(sports) values('baseball');
insert into sports(sports) values('soccer');

create table stores (
    id            INTEGER PRIMARY KEY AUTOINCREMENT,
    store_name     varchar(50)
);

insert into stores(store_name) values('A');
insert into stores(store_name) values('B');
insert into stores(store_name) values('C');

create table equipment (
    id                 INTEGER PRIMARY KEY AUTOINCREMENT,
    equipment_name     varchar(50)
);

insert into equipment(equipment_name) values('shoes');
insert into equipment(equipment_name) values('ball');
insert into equipment(equipment_name) values('clubs');
insert into equipment(equipment_name) values('glove');
insert into equipment(equipment_name) values('bat');

create table sports_equipment (
    sport_id         INTEGER not null,
    equipment_id     INTEGER not null,
    FOREIGN KEY(sport_id) REFERENCES sports(id),
    FOREIGN KEY(equipment_id) REFERENCES equipment(id)
);

insert into sports_equipment values(1, 1);
insert into sports_equipment values(1, 2);
insert into sports_equipment values(1, 3);
insert into sports_equipment values(2, 2);
insert into sports_equipment values(2, 4);
insert into sports_equipment values(2, 5);
insert into sports_equipment values(3, 1);
insert into sports_equipment values(3, 2);

create table sports_equipment_prices (
    id                 INTEGER PRIMARY KEY AUTOINCREMENT,
    store_id           INTEGER not null,
    equipment_id       INTEGER not null,
    price              INTEGER not null,  
    FOREIGN KEY(store_id) REFERENCES stores(id),
    FOREIGN KEY(equipment_id) REFERENCES equipment(id)
);

【讨论】:

  • 是的,我需要一个查询来返回每项运动的运动项目和最低成本(每项运动所需的每种设备,从最便宜的商店购买)。感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 2020-09-13
相关资源
最近更新 更多