0

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ではなく複数の行が返されるのではないかと思います)。

4

2 に答える 2

2

はい、左外側の結合が必要です。複数のアバターを持つユーザーがいる場合にのみ複数の行が返されますが、内部結合についても同じことが言えます。

于 2012-12-19T13:16:27.937 に答える
2

COALESCE()を使用すると、ファイル名が欠落しているように見える場合でも、デフォルト値をプラグインできます。

SELECT u.uid AS uid
        , COALESCE(f.filename, 'goatsex.jpg') AS filename
        , g.field_gender_value AS gender_value
        , c.field_city_value AS city_value
FROM drupal_users u
JOIN drupal_field_data_field_gender g ON g.entity_id=u.uid 
JOIN drupal_field_data_field_city c ON c.entity_id=u.uid
LEFT JOIN drupal_file_managed f ON u.picture=f.fid 
WHERE u.name='Alex' 
        ;
于 2012-12-19T13:37:52.660 に答える