使用内部联接的相当复杂的SQL语句(我认为)


Fairly complex SQL statement using inner join (I presume)

我很难弄清楚如何编写SQL查询以从以下表结构返回结果。

我做的第一件事是通过获得状态等于1的客户端列表

SELECT * FROM clients WHERE status=1

然后我需要获取属于某个客户端的所有用户电子邮件地址。我的计划是循环遍历上面的查询结果,并为每个客户端运行多个查询。从表"client_user_list"中可以看到,单个用户可以属于多个客户端。

我试着做这样的事情:

SELECT emailaddress 
FROM users 
INNER JOIN client_user_list ON users.user_id = client_user_list.user_id 
WHERE users.client_id = 1

但它失败了。正如你所看到的,我在这方面完全是个新手。如有任何帮助,我们将不胜感激,或随时为我提供适当的资源以了解更多信息。我看了看,但没有发现任何东西能涵盖这样复杂的东西。

附加信息:使用外键,客户端之间存在关系<->client_user_list和client_user-list<->用户

clients:
|---------------------------------------|
|  client_id  |  client_name   | status |
|---------------------------------------|
|      1      |    John Doe    |    1   |
|      2      |    James Doe   |    0   |
|---------------------------------------|
client_user_list:
|----------------------|
| client_id  | user_id |
|----------------------|
|     1      |    5    |
|     2      |    6    |
|     1      |    6    |
|----------------------|
users:
|---------------------------------------|
|   user_id   |       emailaddress      |
|---------------------------------------|
|      5      |     notan@email.com     |
|      6      |     afake@email.com     |
|---------------------------------------|

提前非常感谢。

我不确定这是否是您唯一的问题,因为您没有指定确切的问题是什么,但查询的WHERE-子句包含一个错误。您的查询应该改为:

SELECT DISTINCT emailaddress 
FROM users 
INNER JOIN client_user_list ON users.user_id = client_user_list.user_id 
WHERE client_user_list.client_id = 1

users表没有名为client_id的字段,client_user_list表有。

您可以通过连接所有三个表来获得具有status = 1的客户端,并且他们的用户只需要一个查询:

select clients.client_id, clients.client_name, users.user_id, users.emailaddress
from clients
inner join client_user_list on client_user_list.client_id = clients.client_id
inner join users on client_user_list.user_id = users.user_id
where clients.status = 1
order by clients.client_id, users.user_id

以下命令应能解决此问题我希望它是有用的。

select distinct use.emailaddress
from clients cli
inner join client_user_list cul on (cli.client_id=cul.client_id)
inner join users use on (cul.user_id = use.user_id)
where cli.status = 1