Я использую 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».
Что я делаю неправильно, пожалуйста?
EDIT: добавлена m.yw обратно в о-п – Daniel