| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Базы Данных > Неоднозначный запрос |
| Автор: donion 18.2.2011, 21:06 | ||||
Есть таблица пользовательских логотипов:
Есть таблица пользовательских сообщений, друг другу:
В распоряжение есть user_id, С помощью этого user_id нужно запросить из базы последнее сообщение двух людей + логотип пользователя, который принадлежит оппоненту user_id (т.е. в данном случае если user_id = 1, то пользователю с user_id - 2). Это вообще возможно сделать одним запросом? Если да, то хоть какие-то зацепки подскажите, у меня на данный момент получается 3 запроса. |
| Автор: patap 18.2.2011, 23:04 | ||
| можешь немного пояснить у нас есть $user_id, который во второй таблице соответствует sender нам нужно из второй таблицы достать последнее сообщение, которое отослал sender (т.е. sender = $user_id) и из этой же строки по recipient ид достать logo из таблицы 1 (т.е. в результате логотип должен быть для юзера с ид recipient ) верно ? Добавлено @ 23:16 ну в общем, если примерно так как я описал, то вот, думаю должно сработать
|
| Автор: donion 18.2.2011, 23:54 | ||||||
| Ох, действительно, самого главного не объяснил: sender и recipient - это айди пользователей, те самые user_id. Получается, что поскольку есть только один user_id, то нужно: - найти все поля где sender(отправитель) или recipient(получатель) являются пользователем (наш user_id); - сгруппировать по последнему сообщению; - join'ом запросить логотип, c cоседней таблицы, при этом логотип должен быть не пользователя user_id, а его оппонента. Ну, это в идеале,а сейчас у меня получаются три запроса, вот они:
- так я получил массив айдишек последних диалогов, сохранил их в $ids
- так я получил все последние сообщения, в полном формате (т.е. с текстом и прочей информацией), сохранил в $rows и далее приходится делать циклические запросы к логотипам, что вообще никуда не годится. на этом этапе вычисляется айди пользователя (оппонента user_id) запросы эти типа:
p.s. немного изменил структуру таблиц, в первом сообщении. |
| Автор: donion 19.2.2011, 00:17 | ||||||
Да, получается, что наш user_id может быть и recipient, и sender.
оппонентом может быть и recipient, и sender. Приведу пример: - я написал сообщение другому пользователю, мой айдишник записался в базу как sender, а другого пользователя как recipient; - и наоборот, кто-то написал мне сообщение, мой айдишник записался в recipient, а id отправителя в sender; Так вот нужны все записи, где мой айди фигурирует либо в sender, либо в recipient.
В итоге должно вернуть все последние сообщения, в которых фигурировал user_id, при этом лого должен быть оппонента (того, с кем он разговаривал). |
| Автор: patap 19.2.2011, 09:25 | ||
тут не совсем ясно по какому признаку возвращать последние сообщения. Сейчас возвращает все сообщения, в которых фигурировал юзер с заданным ИД. Предполагаю что нужно учитывать created, если да - то добавишь в WHERE нужное условие Добавлено через 1 минуту и 29 секунд если я что-то опять не догнал - говори) |
| Автор: donion 19.2.2011, 13:21 | ||||||||||
по created или pmid.
Да, но логотип все равно будет браться только по recipient, а наш оппонент может быть и sender.
Да, можно и по created, только WHERE не подойдет, оно выдаст либо последнее сообщение, либо все сообщения, в зависимости от того, что будет в WHERE условием. К примеру у нас может быть такая таблица:
Если наш user_id =1, то нам нужны 2,3,4,6 записи. при этом, нужно запросить во второй записи, логотип пользователя 2, в 3 - 3, в 4-4, в 6-5. т.е. так как нужно в условии,
|
| Автор: patap 19.2.2011, 16:49 | ||||
как вернуть последнее сообщение...пока нет идей это, я так понял если к примеру есть следующие данные
то нужно вернуть из этих двух сообщений одно, более позднее? |
| Автор: donion 19.2.2011, 17:14 | ||
Да, верно. За запрос - спасибо! Убирает циклические запросы и это замечательно. Вот бы еще с группировкой что-то решить. |
| Автор: Photon 22.2.2011, 23:11 | ||
|
| Автор: patap 24.2.2011, 15:58 | ||||
Photon, ну это ясно, там в другом причина
нужно вернуть:
|
| Автор: patap 24.2.2011, 17:38 |
| думаю группировать надо по logotypes.user_id |