Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2016, 03:56   #1
OliverVood
Пользователь
 
Регистрация: 06.05.2010
Сообщений: 32
По умолчанию Получить имя

Здравствуйте, господа.
Есть вот такая конструкция:
Код:
SELECT `messages`.`id`, `messages`.`from`, `messages`.`to`, `messages`.`datetime`, `messages`.`text`
FROM `messages`
WHERE `datetime` IN (SELECT max(`datetime`) AS `id` FROM (SELECT `from`, `to`, `datetime` FROM `messages` WHERE `from` = 20 UNION ALL SELECT `to`, `from`, `datetime` FROM `messages` WHERE `to` = 20) t GROUP BY `from`, `to`);
В ней я получаю все последние сообщения всех диалогов пользователя, где:
from - кто отправил,
to - кому,
datetime - время и дата отправления,
text - текст сообщения.
20 - фиксировал id пользователя.
Но мне надо получить ещё и имя собеседника в каждом диалоге. Могу получить его id добавив вот эту конструкцию:
Код:
IF(`messages`.`from` = 20, `messages`.`to`, `messages`.`from`) AS `interlocutor`
Итого:
Код:
SELECT `messages`.`id`, `messages`.`from`, `messages`.`to`, `messages`.`datetime`, `messages`.`text`, IF(`messages`.`from` = 20, `messages`.`to`, `messages`.`from`) AS `interlocutor`
FROM `messages`
WHERE `datetime` IN (SELECT max(`datetime`) AS `id` FROM (SELECT `from`, `to`, `datetime` FROM `messages` WHERE `from` = 20 UNION ALL SELECT `to`, `from`, `datetime` FROM `messages` WHERE `to` = 20) t GROUP BY `from`, `to`);
Пробую сделать левое присоединение:
Код:
SELECT `messages`.`id`, `messages`.`from`, `messages`.`to`, `messages`.`datetime`, `messages`.`text`, IF(`messages`.`from` = 20, `messages`.`to`, `messages`.`from`) AS `interlocutor`, `users`.`login`
FROM `messages`
LEFT OUTER JOIN `users` ON `users`.`id` = `interlocutor`
WHERE `datetime` IN (SELECT max(`datetime`) AS `id` FROM (SELECT `from`, `to`, `datetime` FROM `messages` WHERE `from` = 20 UNION ALL SELECT `to`, `from`, `datetime` FROM `messages` WHERE `to` = 20) t GROUP BY `from`, `to`);
А он мне болт: Unknown column 'interlocutor' in 'on clause';
Как избежать донной проблемы? Помогите пожалуйста.
OliverVood вне форума Ответить с цитированием
Старый 26.08.2016, 08:44   #2
mchip
Форумчанин
 
Регистрация: 24.06.2008
Сообщений: 516
По умолчанию

Ты присоединяешь к несуществующему столбцу!!!
Попробуй так:
Код:
SELECT *
FROM (
SELECT `messages`.`id`, `messages`.`from`, `messages`.`to`, `messages`.`datetime`, `messages`.`text`, IF(`messages`.`from` = 20, `messages`.`to`, `messages`.`from`) AS `interlocutor`
FROM `messages`
WHERE `datetime` IN (SELECT max(`datetime`) AS `id` FROM (SELECT `from`, `to`, `datetime` FROM `messages` WHERE `from` = 20 UNION ALL SELECT `to`, `from`, `datetime` FROM `messages` WHERE `to` = 20) t GROUP BY `from`, `to`)
) AS user_x
LEFT OUTER JOIN `users` ON `users`.`id` = 'user_x'.`interlocutor`;
Можно сделать все! Было бы время, да деньги...

Последний раз редактировалось mchip; 26.08.2016 в 08:47.
mchip вне форума Ответить с цитированием
Старый 26.08.2016, 13:35   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Или так, что бы поменьше вложенность запросов. На счет `datetime` - оно уникально?
Код:
SELECT `messages`.`id`, `messages`.`from`, `messages`.`to`, `messages`.`datetime`, `messages`.`text`, `users`.`login`
  FROM `messages`,
    (SELECT max(`datetime`) AS `datetime`, IF(`from` = 20, `to`, `from`) AS `interlocutor` FROM `messages` WHERE `from` = 20 OR `to` = 20 GROUP BY `from`, `to`) T
    LEFT JOIN `users` ON `users`.`id` = T.`interlocutor`
  WHERE `messages`.`datetime` = T.`datetime`
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.08.2016, 02:18   #4
OliverVood
Пользователь
 
Регистрация: 06.05.2010
Сообщений: 32
По умолчанию

Спасибо, mchip. Всё оказалось так просто.
Аватар, вариант не катит, появляются дубликаты.
OliverVood вне форума Ответить с цитированием
Старый 28.08.2016, 10:41   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Ваще-то не дубли, а последние входящие и исходящие сообщения вместо просто последнего. Немного не так понял, бывает
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить имя домена по IP lollollollol Общие вопросы Delphi 10 06.03.2016 19:40
получить имя активного пользователя JUDAS Общие вопросы Delphi 21 20.09.2015 16:26
Как получить имя листа? ABCOz Microsoft Office Excel 2 29.11.2009 15:37
Как получить имя файла Crazyman Работа с сетью в Delphi 4 11.07.2008 00:47
Получить имя и свойства компонента... prizrak1390 Общие вопросы Delphi 3 08.04.2008 12:13