0

データベースにいくつかのテーブルがあります。

  1. userテーブル:user_id (primary key)、、、、。first_name_last_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)

私は自分のWebサイトでこれを使用しておりinst_name、テーブルの列のすべてのエントリを表示するために必要instですが、右側の特定のIDのエントリのみ、または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';

どんな助けでも大歓迎です。

編集::

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

 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
4

3 に答える 3

1

元のクエリは、テーブルからすべての行を取得し、instテーブルに一致する行があるかどうかをinst_name確認しuser_instsます。存在する場合は、そのテーブルからデータを返します。それ以外の場合は、NULLを返します。JOINをINNERJOINに変更すると、右側が一致する行のみが返されます。このような:

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

于 2012-04-20T06:05:24.380 に答える
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

追加することにより、user_idによって結果を制約できます

where u.user_id = '11'
于 2012-04-20T05:55:29.547 に答える
0

提供されたクエリは次の結果を示していますか?

  1. クエリ1:すべてのinst+user_instsエントリを表示しますが、フィルタリングされていませんuser_id
  2. クエリ2:によってフィルタリングされたinst+user_instsエントリのみを表示しますuser_id

クエリ2で発生しているのは、結合されたテーブルが結合された後、where句が結合されたテーブルをフィルタリングすることです。私はあなたがしたいことは最初に結果の右側( )を次のようなuser_insts特定のものでフィルタリングすることだと思います:user_id

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

inst次に、フィルターの後でテーブル内のすべてのエントリを使用してこれをLEFTJOINします。user_idテーブルに実際に結合する前に最初にフィルタリングするために、内部ビューを使用できinstます。結果のクエリは次のようになります。

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が表示されるように、参加する前に最初にフィルタリングを実行する必要があるということです。

于 2012-04-20T06:04:27.403 に答える