在SQL中与相关子查询作斗争

时间:2019-05-28 09:57:29

标签: mysql sql subquery

我有一个有关旧车,其所有者,事件以及这些事件的参加者的数据库:

所用表的图像:

Image of tables used

PK:主键 FK:外键

现在,我需要获取每个成员(memberId)参加的不同事件(eventId)的数量。 重要说明:成员可以拥有多辆可以参加活动的汽车。

这是我的尝试之一

select m.memberId, count(a.eventId).
from members m where m.memberId in (select c.memberId from cars c where m.memberId =
    c.memberId and c.carId in
    (select d.carId from attendants a where c.carId = d.carId))
order by m.memberId

我也尝试过使用join和group by来获得正确的结果,但是却无济于事。 有谁知道我需要如何构成子查询才能获得所需的结果?

2 个答案:

答案 0 :(得分:3)

因此,您希望成员参加不同的活动。会员有参加活动的汽车。由于不同的汽车可以参加相同的活动,因此您需要与其他活动区分开来:

select m.memberId, count(distinct a.eventId)
from members m 
  join cars c on c.memberId = m.memberId
  join attendants a on a.carId = c.carId
group by m.memberId

答案 1 :(得分:0)

不确定是否使用该确切语句,但是语法有几个问题。您正在使用不存在的别名(d.CarID-什么表是d?),并且末尾没有group by语句,该语句告诉引擎您要从中保留值的列。尝试这样的事情:

try {
    if (countriesMap.get(indicatorDetail.getiCountryId().getId()) != null) {
        System.out.println("if called");

        sumOfWeightedIndicator = sumOfWeightedIndicator + countriesMap.get(indicatorDetail.getiCountryId().getId());

        sumOfIndicator = sumOfIndicator + (Double.valueOf(indicatorDetail.getiIndicatorValue()) * countriesMap.get(indicatorDetail.getiCountryId().getId()));
        retnull = true;

    }
} catch (Exception e) {
    System.out.println("Exception : " + e);
}

内部查询得到您想要的-通过自己拥有的汽车参加的所有成员的一个大列表,经过重复数据删除,因此,如果他们在同一事件中有两辆汽车,它们只会被记录一次-然后被计入每个成员。