2016-02-15 55 views
2

我對MYSQl相當陌生。我正在嘗試創建一個適合我需求的查詢。我開發了一個sqlfiddle.如果user_id以met_user的形式存在,則mysql返回true

這是故事。我有5張桌子。用戶,地點,會議,參加和會見。

最後,我希望能夠選擇地點來查看會議在那裏舉行。我想查看每次會議的與會者。我相信我可以輕鬆完成所有這一切。但...

這裏是我掛了。我想列出所有參加會議的用戶(實際上,這應該排除我自己的ID)。因此,一列應該是user_names,列出參加會議的所有用戶(不包括我),另一列列出我遇到的人顯示爲True或False或類似內容。因此,所有來自特定meeting_id的用戶都將參加會議,並且對於來自表格的所有用戶都具有我的user_id和他們的user_id作爲met_user。

我可以實現許多不同的mysql元素。我正在爲這個掙扎。

這裏是我的架構

CREATE TABLE users (user_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
        user_name VARCHAR(30) NOT NULL); 

CREATE TABLE places (place_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
        place_name VARCHAR(30) NOT NULL); 

CREATE TABLE meetings (meeting_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
         place_id INT(6), 
         meeting_name VARCHAR(30) NOT NULL); 

CREATE TABLE attend (attend_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
        meeting_id INT(6), 
        user_id INT(6)); 

CREATE TABLE met (met_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
        meeting_id INT(6), 
        user_id INT(6), 
        met_user INT(6)); 

INSERT INTO users (user_name) 
VALUES ('Jason'), ('Billy'), ('Sarah'), ('Julie'), ('Jennifer'), ('Laura') ; 

INSERT INTO places (place_name) 
VALUES ('London'), ('Paris'), ('New York'), ('Rome'); 

INSERT INTO meetings (place_id, meeting_name) 
VALUES ('1', 'London Meeting #1'), ('1','London Meeting #2'), ('2','Paris Meeting'), ('3','New York Meeting'), ('4','Rome Meeting'); 

INSERT INTO attend (meeting_id, user_id) 
VALUES ('1', '1'), ('2','1'), ('1','2'), ('1','3'), ('1','4'), ('1','5'), ('1','6'); 


INSERT INTO met (meeting_id, user_id, met_user) 
VALUES ('1', '1', '2'), ('1', '1', '3'),('1', '1', '4'), ('1', '2', '1'), ('1', '2', '3'), ('1', '2', '4'); 

這裏是我想可能是最接近的一個查詢。

Select u.*, at.meeting_id, at.user_id, m.meeting_name, met.* 
from users as u 
JOIN attend as at 
ON at.user_id = u.user_id 
JOIN meetings as m 
ON at.meeting_id = m.meeting_id 
LEFT JOIN met as met 
ON met.user_id = at.user_id 

Where m.meeting_id = 1 

此查詢我所有的(我是傑森在這個例子中)met_users,所有的比利的met_users,併爲null所有其他與會者(這是我想要的部分)顯示。

**[Results][2]**: 
| user_id | user_name | meeting_id | user_id |  meeting_name | met_id | meeting_id | user_id | met_user | 
|---------|-----------|------------|---------|-------------------|--------|------------|---------|----------| 
|  1 |  Jason |   1 |  1 | London Meeting #1 |  1 |   1 |  1 |  2 | 
|  1 |  Jason |   1 |  1 | London Meeting #1 |  2 |   1 |  1 |  3 | 
|  1 |  Jason |   1 |  1 | London Meeting #1 |  3 |   1 |  1 |  4 | 
|  2 |  Billy |   1 |  2 | London Meeting #1 |  4 |   1 |  2 |  1 | 
|  2 |  Billy |   1 |  2 | London Meeting #1 |  5 |   1 |  2 |  3 | 
|  2 |  Billy |   1 |  2 | London Meeting #1 |  6 |   1 |  2 |  4 | 
|  3 |  Sarah |   1 |  3 | London Meeting #1 | (null) |  (null) | (null) | (null) | 
|  4 |  Julie |   1 |  4 | London Meeting #1 | (null) |  (null) | (null) | (null) | 
|  5 | Jennifer |   1 |  5 | London Meeting #1 | (null) |  (null) | (null) | (null) | 
|  6 |  Laura |   1 |  6 | London Meeting #1 | (null) |  (null) | (null) | (null) | 
+0

感謝您編輯@ollie Jones。你是怎麼做到的?原諒我的無知。 – foxtangocharlie

+0

OFF:您需要足夠的聲望才能做到這一點。 – vaso123

+0

Stack Overflow使用Markdown。當你在一個問題中放置代碼時,如果你用四個空格縮進它的行,你會得到代碼塊。您可以編輯自己的問題而不用聲望。 –

回答

1

您是否想實現這樣的目標? (如果沒有,你能發佈你期待的查詢結果):

select u.user_id,u.user_name, 
    case when exists (select * from met where met.user_id = 1 AND met.met_user = u.user_id) then 'true' else 'false' end didIMeet 
from users as u join attend as at 
    on u.user_id = at.user_id 
    join meetings as m 
    on at.meeting_id = at.meeting_id 
where m.meeting_id = 1 
    and u.user_id <> 1 
+0

這正是我所希望的。非常感謝!!! – foxtangocharlie

+0

接下來,我只需要列出那些遇見過的人(他們已經在會議桌上列出了我,並且我在會議桌上遇到了他們)。這是我確信的另一個問題。 – foxtangocharlie

+0

我很高興它爲你工作,下一個問題也聽起來可以實現,試試看,並尋求幫助,如果你需要,歡呼! –

0

一個潛在的解決方案擴展您的查詢:

Select u.*, at.meeting_id, at.user_id, m.meeting_name, met.*, case when met.met_id is null then 'no' else 'yes' end as met 
from users as u 
JOIN attend as at 
ON at.user_id = u.user_id 
JOIN meetings as m 
ON at.meeting_id = m.meeting_id 
LEFT JOIN met as met 
ON (met.user_id = at.user_id and met.met_user = 1) 

Where m.meeting_id = 1 
AND u.user_id != 1 
  • 過濾你的user_id出
  • 使用您的user_id作爲附加連接條件中的左連接
  • 使用條件表達式在select中獲得'yes'/'no'而不是NULL或某些數字

這種方法的一個問題是您的met表格未被完全填充。爲了這個工作,你將需要兩個條目爲每個配對:(1 1 3)和(1 3 1),(1 1 4)和(1 4 1)等。我認爲你將需要完全配對,儘快你想重複查詢另一個用戶。

相關問題