如何显示来自相关子查询的表的两个详细信息。 #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的主要内容,如果未能解决你的问题,请参考以下文章

当涉及两个以上的表时,如何将来自相似字段的单个表的两个左连接转换为 LINQ? [复制]

两个不同表的除法结果

如何在哈姆雷特的列表中组合来自单独查询的“详细信息”?

SQL怎样合并显示两个没有关联的表

模拟数据库事务?

Ria Services:使用两个数据模型