Join several tables (to fetch user info), but one of them is optional (user avatar) - Mailing list pgsql-general

From Alexander Farber
Subject Join several tables (to fetch user info), but one of them is optional (user avatar)
Date
Msg-id CAADeyWg26i6gmynZejRvEKL7rsBLpZm5ncPfkTrHk+_pSHa1kw@mail.gmail.com
Whole thread Raw
Responses Re: Join several tables (to fetch user info), but one of them is optional (user avatar)  (Albe Laurenz <laurenz.albe@wien.gv.at>)
List pgsql-general
Hello,

given a user name in a Drupal 7.17 database
using PostgreSQL 8.4.13 I am trying to fetch user info
(uid, city, gender, avatar) distributed over several tables.

The avatar is however optional - some users don't have it.

For users, that do have avatars my query works well:

#  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)

However for users, who don't have avatar I get empty result.

When I omit the drupal_file_managed  table - it works again:

#  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)

How could I modify my join statement to
ensure that it always returns 1 row for valid users -
regardless if they have avatar or not?

Do I want a "left outer join" here?
(I'm afraid it will return several rows instead of 1).

Regards
Alex


pgsql-general by date:

Previous
From: Glyn Astill
Date:
Subject: Re: Vacuum analyze verbose output
Next
From: James Cowell
Date:
Subject: Re: Corrupt indexes on slave when using pg_bulkload on master