2011-01-02 2 views
3

Я использую PostgreSQL 8.4.6 с CentOS 5.5 и есть таблица пользователей: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) 

Тогда я пытаюсь отобразить оба этих Infos для пользователя, но я заинтересован только в деньгах пользователя на текущую неделю:

# 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.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».

Что я делаю неправильно, пожалуйста?

ответ

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

EDIT: добавлена ​​m.yw обратно в о-п – Daniel

1

Вы хотите поместить условие фильтра u.id='DE2' в предложение WHERE, оставив все остальное в предложении ON. Для каждого пользователя, который не поддерживает ON, он все равно выводит строку с данными от u и имеет значение null для m.

1

Try переместив

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; 
Смежные вопросы