PostgreSQL:左外连接语法

我正在使用PostgreSQL 8.4.6与CentOS 5.5,并有一个用户表:

# select * from pref_users where id='DE2';
 id  | first_name | last_name | female |      avatar      |        city         | lat | lng |           login            | last_ip | medals |           logout
-----+------------+-----------+--------+------------------+---------------------+-----+-----+----------------------------+---------+--------+----------------------------
 DE2 | Alex       |           | f      | 2_1280837766.jpg | г. Бохум в Германии |     |     | 2011-01-02 19:26:37.790909 |         |        | 2011-01-02 19:29:30.197062
(1 row)

另一张表列出了他们每周在游戏中赢得的“虚拟货币”:

# select * from pref_money where id='DE2';
 id  | money |   yw
-----+-------+---------
 DE2 |    66 | 2010-48
(1 row)

然后我试图为用户显示这两个信息,但我只对当前用户的钱感兴趣:

# select u.id,u.first_name,u.city,u.avatar,m.money,u.login > u.logout as online
from pref_users u,pref_money m where
    m.yw=to_char(current_timestamp,'YYYY-IW') and
    u.id=m.id and
    u.id='DE2'
order by m.money desc;
 id | first_name | city | avatar | money | online
----+------------+------+--------+-------+--------
(0 rows)

在这种情况下,我没有行,因为用户’DE2’本周尚未获得任何“虚拟货币”.

我想更改我的查询,以便它始终返回现有用户的数据,如果他们本周没有播放 – 那么查询应该返回0.

所以我想我需要outer left join而且我正在尝试:

select u.id,u.login > u.logout as online
from pref_users u left outer join pref_money m on (
    m.yw=to_char(current_timestamp,'YYYY-IW') and
    u.id=m.id and
    u.id='DE2')
order by m.money desc;

但是这些返回了很多不同用户的行,而不是只有id =’DE2’的行.

我做错了什么?

解决方法

select u.id,coalesce(m.money,0),u.login > u.logout as online
  from pref_users u left outer join pref_money m on u.id=m.id
       and m.yw=to_char(current_timestamp,'YYYY-IW') 
 where u.id='DE2'
 order by m.money desc;

相关文章

文章浏览阅读601次。Oracle的数据导入导出是一项基本的技能,...
文章浏览阅读553次。开头还是介绍一下群,如果感兴趣polardb...
文章浏览阅读3.5k次,点赞3次,收藏7次。折腾了两个小时多才...
文章浏览阅读2.7k次。JSON 代表 JavaScript Object Notation...
文章浏览阅读2.9k次,点赞2次,收藏6次。navicat 连接postgr...
文章浏览阅读1.4k次。postgre进阶sql,包含分组排序、JSON解...