Я создаю функцию обмена сообщениями в приложении Django 1.6.2 с использованием PostgreSQL 9.3.4. На домашней странице «Сообщения» пользователя я покажу список разговоров, которые пользователь ведет с другими пользователями. Каждая «плитка» или блок беседы будет показывать изображение и имя другого пользователя в этом диалоге, дату отправки последнего сообщения в этом диалоге и первые 25 символов в этом последнем сообщении. Я также покажу небольшой значок «ответить», если последнее сообщение было отправлено пользователем, просматривающим эти разговоры. У меня есть запрос до такой степени, что я могу идентифицировать все разговоры между зрителем и всеми другими пользователями, но у меня возникают проблемы с извлечением нужных мне полей из таблиц пользователей и сообщений.
Мои таблицы (показаны внизу): «Пользователь», «Сообщение» и «Разговор». Хотя я реализовал свои схемы таблиц так, чтобы между пользователями и разговорами существовала связь «многие ко многим», вначале я собираюсь создать свой интерфейс, чтобы пользователь мог отправлять сообщения только одному другому пользователю, а не несколько пользователей.
Когда я запускаю свой запрос по данным, показанным ниже, я пытаюсь получить обратно беседу и идентификаторы пользователей для пользователей 3, 4, 5 вместе с их связанными именами пользователей, последнее сообщение в этом разговоре, кто его отправил и дата его отправки. Вместо этого я получаю сообщение об ошибке:
ERROR: syntax error at or near "WHERE"
Может ли кто-нибудь помочь мне исправить этот запрос? Меня больше интересует скорость, чем элегантность.
Прецедент
Данные в таблице связывания беседы_пользователь:
id | conversation_id | user_id
----+-----------------+---------
1 | 1 | 32
2 | 1 | 3 <- want this
3 | 2 | 32
4 | 2 | 4 <- want this
6 | 3 | 3
7 | 3 | 1
8 | 4 | 32
9 | 4 | 5 <- want this
10 | 5 | 7
11 | 5 | 9
Ряды хочу вернуть. Каждое сообщение - последнее сообщение в этой беседе.
conversation_id | user_id | username | from_user | message | send_date
----------------+---------+-----------+-----------+---------+----------
1 | 3 | user3 | u3 or u32 | <msg3> | <date>
2 | 4 | user4 | u4 or u32 | <msg4> | <date>
4 | 5 | user5 | u5 or u32 | <msg5> | <date>
Запрос, который не работает:
SELECT cu.conversation_id,
cu.user_id,
au.username,
m.from_user,
m.message,
m.send_date
FROM conversation_user cu
INNER JOIN auth_user au ON cu.user_id = au.id
INNER JOIN message m ON cu.conversation_id = m.conversation_id
ORDER BY m.send_date DESC LIMIT 1
WHERE conversation_id IN
(SELECT conversation_id
FROM conversation_user
WHERE user_id = 32)
AND user_id != 32;
Определения таблиц
# auth_user
--------------+--------------------------+------------------------------
id | integer | not null default nextval(...
username | character varying(30) | not null
Referenced by:
TABLE "conversation_user" CONSTRAINT "conversation_user_user_id_fkey" FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED
TABLE "message" CONSTRAINT "message_from_user_id_fkey" FOREIGN KEY (from_user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED
# conversation
------------+--------------------------+--------------------------------
id | integer | not null default nextval(...
start_date | timestamp with time zone | not null
Referenced by:
TABLE "conversation_user" CONSTRAINT "conversation_id_refs_id_4344ca71" FOREIGN KEY (conversation_id) REFERENCES conversation(id) DEFERRABLE INITIALLY DEFERRED
TABLE "message" CONSTRAINT "message_conversation_id_fkey" FOREIGN KEY (conversation_id) REFERENCES conversation(id) DEFERRABLE INITIALLY DEFERRED
# conversation_user
-----------------+---------+--------------------------------------------
id | integer | not null default nextval(...
conversation_id | integer | not null
user_id | integer | not null
Foreign-key constraints:
"conversation_id_refs_id_4344ca71" FOREIGN KEY (conversation_id) REFERENCES conversation(id) DEFERRABLE INITIALLY DEFERRED
"conversation_user_user_id_fkey" FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED
# message
Column | Type |
-----------------+--------------------------+---------------------------
id | integer | not null default nextval(...
conversation_id | integer | not null
from_user_id | integer | not null
to_user_uid | integer | not null
message | text | not null
send_date | timestamp with time zone | not null
Foreign-key constraints:
"message_conversation_id_fkey" FOREIGN KEY (conversation_id) REFERENCES conversation(id) DEFERRABLE INITIALLY DEFERRED
"message_from_user_id_fkey" FOREIGN KEY (from_user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED
ORDER BY
в положение послеWHERE
условий:WHERE conversation_id..... ORDER BY m.send_date DESC LIMIT 1
- person Lamak   schedule 14.01.2015