我有一个名为 users 的表,其中包含用户 ID,还有一些表,例如 cloud_storage_a
、cloud_storage_b
和 cloud_storage_c
。如果用户存在于 cloud_storage_a
中,则意味着他们已连接到云存储 a。一个用户也可以存在于多个云存储中。这是一个例子:
用户
表:
user_id | address | name
-------------------------------
123 | 23 Oak Ave | Melissa
333 | 18 Robson Rd | Steve
421 | 95 Ottawa St | Helen
555 | 12 Highland | Amit
192 | 39 Anchor Rd | Oliver
cloud_storage_a
:
user_id
-------
421
333
cloud_storage_b
:
user_id
-------
555
cloud_storage_c
:
user_id
-------
192
555
等等
我想创建一个查询来获取所有连接到任何云存储的用户。因此对于此示例,应返回用户 421、333、555、192
。我猜这是某种联接,但我不确定是哪一种。
最佳答案
你很接近。您想使用 UNION 将记录集/表堆叠在彼此之上,而不是基于键将彼此相邻的表合并的 JOIN。
SELECT user_id FROM cloud_storage_a
UNION
SELECT user_id FROM cloud_storage_b
UNION
SELECT user_id FROM cloud_storage_c
在此处使用关键字 UNION
将为所有三个表提供不同的 user_id。如果您将其切换为 UNION ALL
,您将不再获得 Distinct,这在其他情况下具有优势(显然不是在这里)。
编辑添加:
如果你想引入用户地址,你可以使用这个东西作为子查询并加入你的用户表:
SELECT
subunion.user_id
user.address
FROM
user
INNER JOIN
(
SELECT user_id FROM cloud_storage_a
UNION
SELECT user_id FROM cloud_storage_b
UNION
SELECT user_id FROM cloud_storage_c
) subunion ON
user.user_id = subunion.user_id
随着您添加更多 cloud_storage_N 表,该联合将需要增长。总而言之,这不是一个很棒的数据库设计。您最好创建一个 cloud_storage
表并有一个字段来描述它是 a
、b
、c
, ... ,N
那么您的 UNION 查询将只是SELECT DISTINCT user_id FROM cloud_storage;
,您永远不需要再次编辑它。
关于sql - 如何在多个表中查找不同的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33244910/