我正在使用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;