我有一个用户国家/地区表,其中我列出了一个用户国家/地区列表 - 用户可以拥有多个地址,因此有很多国家
它通过地址表
连接到用户表如果我从UserCountry返回的选择不同的CountryId返回的是:
1
2
3
4
5
6
etc
如果我运行以下查询,我会收到一个用户返回
select * from User u join Address a
on u.AddressId = a.Id
where a.CountryId = 1
如果我再运行
select * from User u join Address a
on u.AddressId = a.Id
where a.CountryId = 2
我没有返回任何数据,这很好。我需要做的是传入一个包含所有不同Country Ids的列表,并生成一个输出,其中set返回一个User Object,哪个set不返回User对象
答案 0 :(得分:1)
以下查询:
SELECT CountryId, COALESCE(t2.cnt, 0) AS usersPerCountry
FROM (
SELECT DISTINCT CountryId
FROM UserCountry) AS t1
LEFT JOIN (
SELECT a.CountryId, COUNT(*) AS cnt
FROM User u
INNER JOIN Address a ON u.AddressId = a.Id
GROUP BY a.CountryId
) AS t2 ON t1.CountryId = t2.CountryId
ORDER BY COALESCE(t2.cnt, 0) DESC
将为您提供与每个国家/地区相关联的用户数量。如果某个国家/地区与任何用户完全无关,则会返回0
。
<强>解释强>
上述查询使用了两个派生表t1
和t2
:
t1
包含CountryId
中包含的所有不同UserCountry
值的列表。 t2
返回每CountryId
个用户数。此子查询不返回没有用户的ID。在LEFT JOIN
和t1
之间以t2
作为第一个表格执行t1
会返回 t1
的所有值,即 CountryId
中包含的所有 UserCountry
值。如果t2
中没有匹配项,则t2.cnt
为NULL
。 COALESCE
子句中使用的SELECT
会将此NULL
值转换为0
。
答案 1 :(得分:0)
这将为您提供没有国家/地区条目的用户和地址中的所有项目。这是你在找什么?
SELECT *
FROM User U
JOIN Address a
ON a.Id = u.AddressId
WHERE NOT EXISTS
(
SELECT 1
FROM UserCountry uc
WHERE uc.CountryId = a.CountryId
);
对于没有用户的Country
项列表,您可以替换这些语句,并找到CountryId
和{{1}中NOT EXISTS
User
的位置表格