powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос с условиями
8 сообщений из 8, страница 1 из 1
Запрос с условиями
    #39038865
Random2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть две таблицы: 1 - messages, в которой содержится информация про сообщения и msg_queue содержит записи - для каждого пользователя отдельная запись. То есть, например пользователь с ID 10 отправил сообщение пользователю 20. В messages добавляется одна строка с данными об этом сообщении, а в таблицу msg_queue - для каждого пользователя инфа, прочитал ли он сообщение (read) и когда прочитал (date_read). Соответственно в msg_queue будет две записи - для пользователя 10 read = true, а для 20 - read = false.

Запрос, который возвратит все записи:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT
	messages.ID as msg_id,
	messages.user_id as sender_id,
	messages.message,
	messages.chat_id,
	msg_queue.user_id as recipient_id,
	msg_queue.date_read,
	msg_queue.read
FROM
	msg_queue
	INNER JOIN messages ON messages.ID = msg_queue.msg_id
WHERE
	messages.chat_id = 30



Часть из результата:
Код: css
1.
2.
3.
4.
5.
msg_id	sender_id	message		chat_id		recipient_id	date_read	read
1301	187		test01		30		112		-1		f
1301	187		test01		30		187		1440715376	t
1300	112		Dxvbk		30		112		1440600150	t
1300	112		Dxvbk		30		187		1440600150	t



Реально ли написать такой запрос, чтобы группируя записи по msg_id он сначала возвращал записи, которые read=false, но если таких нету, то возвращал самую раннюю date_read, при этом отсеяв дубликаты по msg_id? Не прошу за меня написать запрос - форум ведь не для этого, но подскажите, реально ли обойтись просто запросом и в каком направлении искать ответ?
...
Рейтинг: 0 / 0
Запрос с условиями
    #39038877
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Random2,

Разумеется.
Где искать - в докуметации , конечно же.
...
Рейтинг: 0 / 0
Запрос с условиями
    #39038889
Random2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ursido , про DISTINCT знаю, но как связать его с моей задачей - не представляю. Да и одного DISTINCT, как я понимаю, маловато будет. Меня вообще терзают смутные сомнения, что это одним простым запросом реально сделать. Чтобы не терять время хотел бы узнать у знающих людей, реально это сделать или нет?
...
Рейтинг: 0 / 0
Запрос с условиями
    #39038894
Random2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, я неправильно описал этот вопрос:
автор группируя записи по msg_id он сначала возвращал записи, которые read=false, но если таких нету, то возвращал самую раннюю date_read, при этом отсеяв дубликаты по msg_id

нужно группируя записи по msg_id вернуть записи, у которых sender_id != recipient_id и при этом, если есть read=true, то среди них вернуть самое меньшее значение date_read, иначе в поле read для этой записи вернуть false.
...
Рейтинг: 0 / 0
Запрос с условиями
    #39038896
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Random2как связать его с моей задачей - не представляюпопробуй перечитать данную тебе ссылку еще шесть раз. и выполнить пример.
Random2вернуть записи, у которых sender_id != recipient_idа это уже перечитывай про where.
...
Рейтинг: 0 / 0
Запрос с условиями
    #39038901
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Random2... Да и одного DISTINCT, как я понимаю, маловато будет...

Эм. Позвольте усомниться в Вашем понимании

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT DISTINCT ON (messages.ID)
  messages.ID as msg_id,
  messages.user_id as sender_id,
  messages.message,
  messages.chat_id,
  msg_queue.user_id as recipient_id,
  msg_queue.date_read,
  msg_queue.read
FROM msg_queue
INNER JOIN messages ON messages.ID = msg_queue.msg_id
WHERE messages.chat_id = 30
  AND messages.user_id <> msg_queue.user_id
ORDER BY messages.ID, msg_queue.read DESC, msg_queue.date_read
...
Рейтинг: 0 / 0
Запрос с условиями
    #39039008
Random2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ursido, предложенный Вами вариант работает так, как нужно. Нужно было всего лишь сделать сортировку по нужным полям, т.к. я пробовал похожий запрос, но без сортировки по msg_queue.read. Также пробовал и условия (CASE..WHEN) и подзапросы, но не в ту сторону это все было. Спасибо за помощь!
...
Рейтинг: 0 / 0
Запрос с условиями
    #39039050
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Random2Нужно было всего лишь сделать сортировку по нужным полям

БЛДЖАД!
А теперь почитаем документацию в слух:

авторThe DISTINCT ON expressions are interpreted using the same rules as for ORDER BY (see above). Note that the "first row" of each set is unpredictable unless ORDER BY is used to ensure that the desired row appears first.
авторThe DISTINCT ON expression(s) must match the leftmost ORDER BY expression(s). The ORDER BY clause will normally contain additional expression(s) that determine the desired precedence of rows within each DISTINCT ON group.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос с условиями
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]