2011-01-02 1 views
3

내가 CentOS는 5.5 PostgreSQL의 8.4.6을 사용하고 가입하고 사용자의 테이블이 왼쪽 :PostgreSQL의 : 외부 구문

# 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

를 반환해야

select u.id, 
    u.first_name, 
    u.city, 
    u.avatar, 
    m.money, 
    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; 

을하지만, 이러한 반환 나를 대신 한 아이디 = 'DE2'와 다른 사용자와 행의 많은 : outer left join 내가 노력하고있어.

내가 뭘 잘못하고 있니?

답변

5
select u.id, 
     u.first_name, 
     u.city, 
     u.avatar, 
     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; 
+0

편집이 : 다시 온 절에 m.yw 추가 – Daniel

1

WHERE 절에 필터 조건 u.id='DE2'을 넣고 나머지 항목은 모두 ON 절에두고 싶습니다. ON이 일치하지 않는 모든 사용자에 대해 u의 데이터 행과 m의 null을 출력합니다.

1

시도 같은 절, WHERE 다음에

u.id='DE2' 

이동 :

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