如何显示相关子查询中表的两个详细信息。 #mysql
how to display two details of tables from a correlated subquery. #mysql
我想显示套餐的详细信息及其最便宜的子活动的详细信息。
假设有 A01,A02,A03
A01 是套餐,A03 是最便宜的儿童活动,
所以我的 select 语句应该显示 A01、A03
的详细信息
但是我不明白如何将最便宜的 sub-activity[A03] 的详细信息与 A01 一起显示。
我知道我必须使用相关子查询,但仍然无法正常工作。
现在只显示最便宜的套餐结果。
DDL
CREATE TABLE IF NOT EXISTS `Activity` (
`ActivityID` VARCHAR(45) NOT NULL,
`ActivityName` VARCHAR(45) NULL,
`ActivityCost` float(2) NULL,
`ActivityType` VARCHAR(45) NULL);
CREATE TABLE IF NOT EXISTS `Package` (
`PackageActivityID` VARCHAR(45) NOT NULL,
`ChildActivityID` VARCHAR(45) NOT NULL,
INDEX `fk_Package_Activity1_idx` (`PackageActivityID` ASC) VISIBLE,
INDEX `fk_Package_Activity2_idx` (`ChildActivityID` ASC) VISIBLE,
CONSTRAINT `fk_Package_Activity1`
FOREIGN KEY (`PackageActivityID`)
REFERENCES `mydb`.`Activity` (`ActivityID`)
CONSTRAINT `fk_Package_Activity2`
FOREIGN KEY (`ChildActivityID`)
REFERENCES `mydb`.`Activity` (`ActivityID`);
insert into activity values ('A01', 'Kayaking', 120, 'B');
insert into activity values ('B01', 'Seaking', 420, 'I');
insert into activity values ('C01', 'maya', 220, 'O');
insert into activity values ('D01', 'bing', 170, 'B');
insert into package (packageactivityid, childactivityid) values ('A01','C01');
insert into package (packageactivityid, childactivityid) values ('F01','F01');
insert into package (packageactivityid, childactivityid) values ('D01','D01');
insert into package (packageactivityid, childactivityid) values ('E01','E01');
insert into package (packageactivityid, childactivityid) values ('B01','B01');
回顾一下,我希望能达到这个结果:
+-------------------+-----------------+------------+--------------+--------------+--------------+
| PackageActivityID | ChildActivityID | ActivityID | ActivityName | ActivityCost | ActivityType |
+-------------------+-----------------+------------+--------------+--------------+--------------+
| A01 | C01 | A01 | Kayaking | 120 | B |
| A01 | C01 | A01 | Kayaking | 120 | B |
| A01 | C01 | A01 | Kayaking | 120 | B |
| A01 | C01 | A01 | Kayaking | 120 | B |
| D01 | D01 | D01 | bing | 170 | B |
| D01 | D01 | D01 | bing | 170 | B |
| D01 | D01 | D01 | bing | 170 | B |
| D01 | D01 | D01 | bing | 170 | B |
| B01 | B01 | B01 | Seaking | 420 | I |
| B01 | B01 | B01 | Seaking | 420 | I |
| B01 | B01 | B01 | Seaking | 420 | I |
| B01 | B01 | B01 | Seaking | 420 | I |
+-------------------+-----------------+------------+--------------+--------------+--------------+
我尝试的查询:
select activityid, activityname, activitycost
from package p, activity a
where p.PackageActivityID = a.ActivityID
and p.ChildActivityID = (select ActivityID
from package p,activity a
where a.activityid = p.ChildActivityID
having min(activitycost));
我的查询只显示 packageactivity 的详细信息,不显示 childactivity 的详细信息。
如果我没看错,你可以使用window函数:
select p.*, a.*
from package p
inner join (
select a.*, rank() over(partition by activityid order by activitycost) rn
from activity a
) a on p.PackageActivityID = a.activityid
where a.rn = 1
基本上,这会为每个包裹带来更便宜 activity 的较少细节 - 这就是我对你的问题的理解。此处允许打领带。
在 MySQL < 8.0 中,window 函数不可用,替代方法是使用相关子查询进行过滤:
select p.*, a.*
from package p
inner join activity a on p.PackageActivityID = a.activityid
where a.activitycost = (
select min(a1.activitycost)
from activity a1
where a1.activityid = a.activityid
)
我想显示套餐的详细信息及其最便宜的子活动的详细信息。 假设有 A01,A02,A03 A01 是套餐,A03 是最便宜的儿童活动, 所以我的 select 语句应该显示 A01、A03
的详细信息但是我不明白如何将最便宜的 sub-activity[A03] 的详细信息与 A01 一起显示。
我知道我必须使用相关子查询,但仍然无法正常工作。
现在只显示最便宜的套餐结果。
DDL
CREATE TABLE IF NOT EXISTS `Activity` (
`ActivityID` VARCHAR(45) NOT NULL,
`ActivityName` VARCHAR(45) NULL,
`ActivityCost` float(2) NULL,
`ActivityType` VARCHAR(45) NULL);
CREATE TABLE IF NOT EXISTS `Package` (
`PackageActivityID` VARCHAR(45) NOT NULL,
`ChildActivityID` VARCHAR(45) NOT NULL,
INDEX `fk_Package_Activity1_idx` (`PackageActivityID` ASC) VISIBLE,
INDEX `fk_Package_Activity2_idx` (`ChildActivityID` ASC) VISIBLE,
CONSTRAINT `fk_Package_Activity1`
FOREIGN KEY (`PackageActivityID`)
REFERENCES `mydb`.`Activity` (`ActivityID`)
CONSTRAINT `fk_Package_Activity2`
FOREIGN KEY (`ChildActivityID`)
REFERENCES `mydb`.`Activity` (`ActivityID`);
insert into activity values ('A01', 'Kayaking', 120, 'B');
insert into activity values ('B01', 'Seaking', 420, 'I');
insert into activity values ('C01', 'maya', 220, 'O');
insert into activity values ('D01', 'bing', 170, 'B');
insert into package (packageactivityid, childactivityid) values ('A01','C01');
insert into package (packageactivityid, childactivityid) values ('F01','F01');
insert into package (packageactivityid, childactivityid) values ('D01','D01');
insert into package (packageactivityid, childactivityid) values ('E01','E01');
insert into package (packageactivityid, childactivityid) values ('B01','B01');
回顾一下,我希望能达到这个结果:
+-------------------+-----------------+------------+--------------+--------------+--------------+
| PackageActivityID | ChildActivityID | ActivityID | ActivityName | ActivityCost | ActivityType |
+-------------------+-----------------+------------+--------------+--------------+--------------+
| A01 | C01 | A01 | Kayaking | 120 | B |
| A01 | C01 | A01 | Kayaking | 120 | B |
| A01 | C01 | A01 | Kayaking | 120 | B |
| A01 | C01 | A01 | Kayaking | 120 | B |
| D01 | D01 | D01 | bing | 170 | B |
| D01 | D01 | D01 | bing | 170 | B |
| D01 | D01 | D01 | bing | 170 | B |
| D01 | D01 | D01 | bing | 170 | B |
| B01 | B01 | B01 | Seaking | 420 | I |
| B01 | B01 | B01 | Seaking | 420 | I |
| B01 | B01 | B01 | Seaking | 420 | I |
| B01 | B01 | B01 | Seaking | 420 | I |
+-------------------+-----------------+------------+--------------+--------------+--------------+
我尝试的查询:
select activityid, activityname, activitycost
from package p, activity a
where p.PackageActivityID = a.ActivityID
and p.ChildActivityID = (select ActivityID
from package p,activity a
where a.activityid = p.ChildActivityID
having min(activitycost));
我的查询只显示 packageactivity 的详细信息,不显示 childactivity 的详细信息。
如果我没看错,你可以使用window函数:
select p.*, a.*
from package p
inner join (
select a.*, rank() over(partition by activityid order by activitycost) rn
from activity a
) a on p.PackageActivityID = a.activityid
where a.rn = 1
基本上,这会为每个包裹带来更便宜 activity 的较少细节 - 这就是我对你的问题的理解。此处允许打领带。
在 MySQL < 8.0 中,window 函数不可用,替代方法是使用相关子查询进行过滤:
select p.*, a.*
from package p
inner join activity a on p.PackageActivityID = a.activityid
where a.activitycost = (
select min(a1.activitycost)
from activity a1
where a1.activityid = a.activityid
)