2012-04-20 116 views
0

我在我的數據庫中的幾個表:SQL選擇基於某些數據

  1. user表:user_id (primary key)first_namelast_nameemail_address
  2. inst表:inst_id (primary key),inst_nametype
  3. user_insts表:user_insts_id (primary key)user_insts_statusinst_name (foreign key)user_id(foreign key)

我在我的網站使用這個,我需要它來爲instinst_name列顯示所有entrys的,但只有entrys在右側或者表現出一定的ID爲空。我試過幾件事情如下:

SELECT inst.inst_name,inst.inst_id,user_insts.user_id,user_insts.inst_name 
FROM inst LEFT JOIN user_insts ON inst.inst_name=user_insts.inst_name; 

SELECT inst.inst_name,inst.inst_id,user_insts.user_id,user_insts.inst_name 
FROM inst LEFT JOIN user_insts ON inst.inst_name=user_insts.inst_name 
WHERE user_insts.user_id='11'; 

任何幫助將不勝感激。

編輯::

這是我目前得到:

inst_name inst_id user_id: 
ASB   1  11 
BNZ   3  11 
FMG   5  11 

我希望能夠更多像這樣得到的東西:

inst_name inst_id user_id: 
ASB   1  11 
ANZ   2  NULL 
BNZ   3  11 
paymark  4  NULL 
FMG   5  11 
STATE   6  NULL 
+1

你是什麼意思的加入右側,右側是什麼意思?你指的是什麼你的表字段的ID? – 2012-04-20 05:43:45

+0

您正在使用左連接並期待右側結果? – 2012-04-20 05:58:54

回答

0

請您提供查詢顯示了以下結果由約束USER_ID的結果?

  1. 查詢1:顯示所有inst + user_insts項,但通過user_id
  2. 查詢2未過濾:卻與此inst + user_insts條目由user_id

過濾發生了什麼事在查詢2是該where子句在連接後對它們進行過濾。我猜你想發生什麼是首先由特定user_id像這樣篩選結果(user_insts)的右側:

SELECT ui.inst_name, ui.user_id FROM user_insts ui WHERE ui.user_id = :PARAM 

然後,你要留下的inst表中的所有條目加入該過濾器後。您可以使用內部視圖,以便在實際加入inst表之前先過濾user_id。生成的查詢應該是這樣的:

SELECT i.inst_name, filtered_ui.user_id 
FROM inst i 
LEFT JOIN (SELECT ui.inst_name, ui.user_id 
      FROM user_insts ui 
      WHERE ui.user_id = :PARAM) filtered_ui 
ON i.inst_name = filtered_ui.inst_name 

思考有關它的更多,我不是太熟悉MySQL的,所以我不知道,如果這種替代的查詢是有效的語法:

SELECT i.inst_name, ui.user_id 
FROM inst i 
LEFT JOIN user_insts ui ON i.inst_name = ui.inst_name AND ui.user_id = :PARAM 

...可能比內部視圖更簡單。

主要的一點是你必須先加入之前做過濾,使所有的inst_names將被顯示。

+0

非常感謝你:)這工作完美,你給我的最後一個問題,你不確定如何解決問題。再次感謝:) – user1345603 2012-04-20 19:49:03

0

你的問題是不100%清楚,所以我假設你想顯示每個用戶的inst_name;當inst條目不存在時顯示inst_name爲null。

像這樣的東西應該工作:

select u.user_id, i.inst_name 
from user u 
left join user_insts ui on ui.user_id = u.user_id 
left join inst i on i.inst_name = ui.inst_name 

您可以通過添加

where u.user_id = '11' 
1

您的原始查詢將執行的操作是從inst表中獲取所有行,然後查看user_insts表中是否有與inst_name匹配的行。如果有,它將返回該表中的數據。否則它將返回NULL。如果將JOIN更改爲INNER JOIN,那麼它將只返回右側匹配的行。像這樣:

SELECT inst.inst_name,inst.inst_id,user_insts.user_id,user_insts.inst_name 
FROM inst INNER JOIN user_insts ON inst.inst_name=user_insts.inst_name 
WHERE user_insts.user_id='11'; 

但是你應該看看改變你的模式。你有inst整數主鍵,所以你應該使用,而不是作爲inst_nameinst_name外鍵。

+0

+1「改變架構」評論 – 2012-04-20 06:08:07

+0

我編輯了我的原始查詢,所以它有點清晰。 – user1345603 2012-04-20 19:45:54