2012-04-20 4 views
0

に基づいてSQLを選択:私は、データベース内のいくつかのテーブルを持っている特定のデータ

  1. userテーブル:user_id (primary key)first_namelast_nameemail_address
  2. instテーブル:inst_id (primary key),inst_nameおよびtype
  3. user_instsテーブル:user_insts_id (primary key),user_insts_status,inst_name (foreign key)およびuser_id(foreign key)

私は私のウェブサイト上でこれを使用していると私はそれがinstテーブルのinst_name列にentrysのすべてを表示する必要がありますが、右側または他のショーで特定のIDに対してのみentrys nullとして。私は以下のようないくつか試しました。

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

助けていただければ幸いです。

EDIT ::

これは私が現在、得るものです:

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

右端の結合の右側はどういう意味ですか?また、あなたのテーブルのフィールドの点であなたは何を指していますか? –

+0

あなたは左の結合を使用しており、右の結果を期待していますか? –

答えて

0

を追加することにより、user_idをして結果を制限することができますか?

  1. クエリ1:すべてのinst + user_instsエントリを表示しますがuser_id
  2. クエリ2によってフィルタリングされていない:クエリ2で何が起こっているuser_id

によってフィルタリングだけinst + user_instsエントリを表示すること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, ui.user_id 
FROM inst i 
LEFT JOIN user_insts ui ON i.inst_name = ui.inst_name AND ui.user_id = :PARAM 

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とあまり慣れていないんだので、私はこの代替クエリは有効な構文であるかどうかわからないんだけど...インナービューより簡単かもしれません。

参加する前にまずフィルタリングを行う必要がありますので、inst_namesのすべてが表示されます。

+0

ありがとうございました:)これは完璧に機能しました。最終的な質問は、あなたが私に与えたものです。もう一度感謝:) – user1345603

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テーブルにあるかどうかを確認します。存在する場合は、そのテーブルからデータを返します。それ以外の場合は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_nameではなく、inst_nameの外部キーとして使用する必要があります。

+0

+1 "スキーマの変更"のコメント –

+0

私は元のクエリを編集して、少し鮮明になりました。 – user1345603