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