如何显示来自相关子查询的表的两个详细信息。 #mysql
Posted
技术标签:
【中文标题】如何显示来自相关子查询的表的两个详细信息。 #mysql【英文标题】:how to display two details of tables from a correlated subquery. #mysql 【发布时间】:2021-02-11 20:40:29 【问题描述】:我想显示包的详细信息及其成本最低的子活动的详细信息。 假设有 A01,A02,A03 A01 是套餐,A03 是最便宜的儿童活动, 所以我的选择语句应该显示 A01,A03 的详细信息
但是我不明白如何将最便宜的子活动[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 的详细信息。
【问题讨论】:
添加activity
表定义。从 DDL 中删除所有键/约束。
having min(activitycost)
只是检查 min(activitycost)
是否不是零(或空字符串或 NULL)。
请注意,很少有问题需要您“必须做”某件事。相关子查询只是一种选择,有时它是最佳选择。
【参考方案1】:
如果我没看错,你可以使用窗口函数:
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
基本上,这为每个包裹带来了更便宜的活动的更少细节 - 这就是我理解您的问题的方式。此处允许打领带。
在 mysql
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
)
【讨论】:
这解决了它。过了时限我会接受的。以上是关于如何显示来自相关子查询的表的两个详细信息。 #mysql的主要内容,如果未能解决你的问题,请参考以下文章