PostgreSQL8.4.13を使用してDrupal7.17データベースのユーザー名を指定すると、複数のテーブルに分散されたユーザー情報(uid、city、gender、avatar)を取得しようとしています。
ただし、アバター(f.filename
以下)はオプションです。一部のユーザーはアバターを持っていません。
ユーザーの場合、アバターがありますが、私のクエリはうまく機能します。
# select
u.uid,
/* u.pass, */
f.filename,
g.field_gender_value,
c.field_city_value
from
drupal_users u,
drupal_file_managed f,
drupal_field_data_field_gender g,
drupal_field_data_field_city c
where
u.name='Alex' and
u.picture=f.fid and
g.entity_id=u.uid and
c.entity_id=u.uid
;
uid | filename | field_gender_value | field_city_value
-----+--------------------------+--------------------+------------------
1 | picture-1-1312223092.jpg | Male | Bochum
(1 row)
ただし、アバターを持っていないユーザーの場合、結果は空になります。
テーブルを省略すると、drupal_file_managed f
再び機能します。
# select
u.uid,
/* u.pass, */
g.field_gender_value,
c.field_city_value
from
drupal_users u,
drupal_field_data_field_gender g,
drupal_field_data_field_city c
where
u.name='mvp' and
g.entity_id=u.uid and
c.entity_id=u.uid
;
uid | field_gender_value | field_city_value
-------+--------------------+------------------
18539 | Male | Moscow
(1 row)
アバターを持っているかどうかに関係なく、有効なユーザーに対して常に1行を返すようにjoinステートメントを変更するにはどうすればよいですか?後者のf.filename
場合、列はnullになる可能性があります。
ここで左外側の結合が必要ですか?(1ではなく複数の行が返されるのではないかと思います)。