0

给定使用 PostgreSQL 8.4.13 的 Drupal 7.17 数据库中的用户名,我试图获取分布在多个表中的用户信息(uid、城市、性别、头像)。

然而,头像(下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)

如何修改我的 join 语句以确保它始终为有效用户返回 1 行 - 无论他们是否有头像?对于后一种情况,该f.filename列可以为空。

我想要一个左外连接吗?(恐怕它会返回几行而不是 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 回答