Mysql 连接到所有ID/名称的子查询

Mysql 连接到所有ID/名称的子查询,mysql,Mysql,示例表行 * user user_id name * client client_id name * user_client user_client_id user_id client_id * message message_id client_id description 它不起作用的是,当我将该查询用作左连接上的子查询时,仅为与用户相关的客户机提取消息 有什么想法吗 谢谢 下面显示了在MySQL中设置示例的DDL和我相信您正在寻找的查询 user_id 1 2 3 client

示例表行

* user
user_id
name

* client
client_id
name

* user_client
user_client_id
user_id
client_id

* message
message_id
client_id
description
它不起作用的是,当我将该查询用作左连接上的子查询时,仅为与用户相关的客户机提取消息

有什么想法吗


谢谢

下面显示了在MySQL中设置示例的DDL和我相信您正在寻找的查询

user_id 
1
2
3

client_id   name
10          John
11          James
12          David
13          Richard
14          Bob

user_client
user_id    client_id
1          11
1          13
3          14
3          10

message
message_id    client_id    message
1             11           Hello Word
2             12           MySQL is awesome
3             14           I like StackOverflow
4             13           This is very cool

我原来的ddl中有一个错误,在下面修复的一个插入中。在下面的sql中,我还添加了一个没有消息的用户。我相信下面贴出的最后一个问题就是你要找的

/*

-- DDL TO SET UP EXAMPLE

create schema example;

use example;

create table user (
    user_id int,
    name varchar(64)
);

create table client(
    client_id int,
    name varchar(64)
);

create table user_client (
    user_client_id int,
    user_id int,
    client_id int
);


create table message(
    message_id int,
    client_id int,
    message varchar(64)
);

insert into user values (1, 'Peter');
insert into user values (2, 'Paul');
insert into user values (3, 'Mary');

insert into client values (10, 'John');
insert into client values (11, 'James');
insert into client values (12, 'David');
insert into client values (13, 'Richard');
insert into client values (14, 'Bob');

insert into user_client values (1, 1, 11);
insert into user_client values (2, 1, 11);
insert into user_client values (3, 3, 14);
insert into user_client values (4, 3, 10);

insert into message values (1, 11, 'Hello World');
insert into message values (2, 12, 'MySQL is awesome');
insert into message values (3, 14, 'I like StackOverflow');
insert into message values (4, 13, 'This is very cool');

*/

-- query to get all messages for all clients of a given user

select 
    *
from
    user_client uc
    join user u on uc.user_id = u.user_id
    join client c on uc.client_id = c.client_id
    join message m on m.client_id = c.client_id
where 
    u.user_id = 1;

-- query to get all messages for a given client

select 
    *
from
    user_client uc
    join user u on uc.user_id = u.user_id
    join client c on uc.client_id = c.client_id
    join message m on m.client_id = c.client_id
where 
    c.client_id = 11;
输出:

-- DDL TO SET UP EXAMPLE

drop schema example;

create schema example;

use example;

create table user (
    user_id int,
    name varchar(64)
);

create table client(
    client_id int,
    name varchar(64)
);

create table user_client (
    user_client_id int,
    user_id int,
    client_id int
);


create table message(
    message_id int,
    client_id int,
    message varchar(64)
);

insert into user values (1, 'Peter');
insert into user values (2, 'Paul');
insert into user values (3, 'Mary');

insert into client values (10, 'John');
insert into client values (11, 'James');
insert into client values (12, 'David');
insert into client values (13, 'Richard');
insert into client values (14, 'Bob');
insert into client values (15, 'Quiet Client');

insert into user_client values (1, 1, 11);
insert into user_client values (2, 1, 13);
insert into user_client values (3, 3, 14);
insert into user_client values (4, 3, 10);
insert into user_client values (5, 1, 15);

insert into message values (1, 11, 'Hello World');
insert into message values (2, 12, 'MySQL is awesome');
insert into message values (4, 13, 'This is very cool');
insert into message values (3, 14, 'I like StackOverflow');

-- query to get all messages for all clients of a given user

select 
    u.user_id,
    u.name user_name,
    c.client_id,
    c.name client_name,
    m.message
from
    user_client uc
    join user u on uc.user_id = u.user_id
    join client c on uc.client_id = c.client_id
    left outer join message m on m.client_id = c.client_id
where 
    u.user_id = 1;

这实际上应该作为三个独立的查询来完成,因为根据评论提出了三个不同的问题:


因此,您需要一个查询,该查询将在以下情况下从相关客户端返回消息: 客户端中有一条记录,如果客户端中没有记录,则显示所有消息 特定用户的客户端?–约翰


嗨,约翰,没错。这就是我使用子查询的原因, 因为它正是这样拉的,但出于某种原因,客户id和 除一个名称外,所有名称均为空基塔拉

第一个问题查询是查找给定用户的所有客户端的所有消息

第二个问题是:用户是否有权查看所有消息。如果用户没有客户端,则该用户有权查看所有消息

第三个问题是:如果用户有权查看所有消息,则获取所有消息


这些是非常简单的直接查询,需要编写、执行和理解。试图将所有这些合并到一个查询中会增加复杂性,并且表示关注点分离不良。如果执行三个非常简单的查询代表性能问题,则需要重新考虑应用程序的体系结构

因此,用例是:为给定用户的所有客户端的所有消息选择message\u id、message、client\u id和name?您好@John,这是正确的。@John查询正在工作,但除一个客户端外,所有客户端的client\u id和name都为空。。。我不知道为什么。在这种情况下,当用户\u客户端不包含特定用户\u id的任何条目时,它将显示所有消息?嗨@John,谢谢你的回答,但当我执行user\u id=2时,它将返回0行,而它应该返回所有消息。用户\u id=2没有客户端,因此没有消息。插入顺序为id、user\u id、client\u id插入user\u client值1、1、11;在用户_客户端中插入值2、1、13;在用户_客户端中插入值3、3、14;在用户_客户端中插入值4、3、10;在用户_客户端中插入值5、1、15;为什么您希望user_id=2返回所有消息?这种关系是一条消息有一个客户端,客户端有一个用户。因此,如果用户没有客户端,则该用户没有关联的消息。Hi@John如果该用户在user_client表中没有任何条目,则该用户具有查看此场景中所有客户端的完全授权。因此,如果客户端中有记录,则您需要一个查询,该查询将返回来自相关客户端的消息,如果客户端中没有给定用户的记录,则显示所有消息?您好,John,这是正确的。这就是我使用子查询的原因,因为它确实可以提取,但是出于某种原因,客户端id和名称对于除一个以外的所有对象都是空的。谢谢,我已经找到了查询的错误所在。谢谢
+ ------------ + -------------- + -------------- + ---------------- + ------------ +
| user_id      | user_name      | client_id      | client_name      | message      |
+ ------------ + -------------- + -------------- + ---------------- + ------------ +
| 1            | Peter          | 11             | James            | Hello World  |
| 1            | Peter          | 13             | Richard          | This is very cool |
| 1            | Peter          | 15             | Quiet Client     |              |
+ ------------ + -------------- + -------------- + ---------------- + ------------ +
3 rows