2015-06-10 17 views
0
* user 
user_id 
name 

* client 
client_id 
name 

* user_client 
user_client_id 
user_id 
client_id 

* message 
message_id 
client_id 
description 

樣品錶行子查詢的JOIN來拉動所有的ID /名稱

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 

當我使用該查詢作爲子查詢上剩下的東西它不工作是JOIN拉的消息只爲這些客戶端與用戶有關。

任何想法?

謝謝!

+0

因此,用例是:爲給定用戶的所有客戶端的所有消息選擇message_id,message,client_id和name? – John

+0

嗨@約翰,這是正確的。 – Kitara

+0

@John查詢正在工作,但client_id和name對於除了一個客戶端之外的所有客戶端都是NULL ...我無法弄清楚爲什麼。 – Kitara

回答

0

用於設置示例(在MySQL中)的DDL和我相信您正在查找的查詢如下所示。

/* 

-- 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; 
+0

嗨@John在這種情況下,它會顯示所有的消息,當user_client不包含任何特定的user_id條目? – Kitara

0

我的原始ddl中有一個插入錯誤(下面已修復)。在下面的sql中,我也添加了一個沒有消息的用戶。我相信在下面發佈的內容結尾處的查詢就是您要查找的內容。

-- 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; 

輸出:

+ ------------ + -------------- + -------------- + ---------------- + ------------ + 
| 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 
+0

嗨@John,感謝您的回答,但是當我做user_id = 2時,它返回0行,當它應該返回所有消息。 – Kitara

+0

user_id = 2沒有客戶端,因此沒有消息。 (插入順序爲id,user_id,client_id) insert into user_client values(1,1,11); 插入user_client值(2,1,13); 插入user_client值(3,3,14); 插入user_client值(4,3,10); insert into user_client values(5,1,15); 你爲什麼期望user_id = 2返回所有消息? 關係是一個消息有一個客戶端和一個客戶端有一個用戶。因此,如果用戶沒有客戶端,則用戶沒有關聯的消息。 – John

+0

Hi @John如果用戶在user_client表中沒有任何條目,那麼它具有完全授權以在此方案中查看所有客戶端。 – Kitara

0

三個單獨的查詢三個不同的問題正在被基於評論中問道,這確實應該做到:

所以,你想要一個查詢,將如果 客戶端中有記錄,並且所有消息(如果 客戶端中沒有記錄給予用戶),則返回來自相關客戶端的消息?約翰 -

...

嗨@約翰這是正確的。這就是爲什麼我使用子查詢 的原因,因爲它確切地說明了這一點,但由於某種原因,client_id和 名稱對於除1之外的所有名稱都爲NULL。 - Kitara

第一個問題(查詢)是查找給定用戶的所有客戶端的所有消息。

第二個問題(查詢)是:用戶是否有「授權」來查看所有消息。如果用戶沒有客戶端,則該用戶被「授權」查看所有消息。

第三個問題(查詢)是:如果用戶被授權查看所有消息得到的所有消息。

這些是非常簡單的直接查詢來編寫,執行和理解。試圖將所有這些融合到單個查詢中會增加複雜性並且代表關注點分離的問題。如果執行三個非常簡單的查詢代表性能問題,則應用程序的體系結構需要重新考慮。

+0

謝謝我已經知道查詢出了什麼問題。謝謝 – Kitara