[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите понять запрос
Страницы: 1, 2
Миша


select t.* from

(select max(id) id from

(
select `message_ls01` userID, `message_ls02` userID2, max(id) id from `message_ls` where `message_ls01` = '$id_online' group by `message_ls01`, `message_ls02`

union all

select
`message_ls02` userID, `message_ls01` userID2, max(id) id from `message_ls` where `message_ls02` = '$id_online' group by `message_ls02`, `message_ls01`
)

b group by userID, userID2)

a left join `message_ls` t on t.id = a.id ORDER BY t.id DESC



_____________
Принимаю заказы, писать в ЛС
Миша
С чего, с какого места нужно разбирать этот запрос?

_____________
Принимаю заказы, писать в ЛС
Valick
встречный вопрос:
Что является результатом запроса к БД, что мы получаем в конечном итоге?
Цитата

С чего, с какого места нужно разбирать этот запрос?

а с чего бы ты начал будь это математическая формула?

_____________
Стимулятор ~yoomoney - 41001303250491
Миша
Цитата (Valick @ 16.05.2015 - 10:14)
встречный вопрос:
Что является результатом запроса к БД, что мы получаем в конечном итоге?
Цитата

С чего, с какого места нужно разбирать этот запрос?

а с чего бы ты начал будь это математическая формула?

Вы меня простите, но я такой - пока не разберу каждую строку кода, использовать такой код не могу. А рузультатом должно стать последнее сообщение с каждым собеседником

В message_ls01 - id 1 пользователя или 2 пользователя
В message_ls02 - id 2 пользователя или 1 пользователя

______________________________________________________________

В скобках начало?

_____________
Принимаю заказы, писать в ЛС
Valick
Цитата (Медведь @ 16.05.2015 - 09:20)
В скобках начало?

да

Результатом любого запроса является таблица (хотя у меня и вышел небольшой спор по этому поводу с одним уважаемым человеком, но всё осталось на своих местах, человек уважаем, результат - таблица). Даже состоящая из одной строки, и более того даже состоящая из одной строки и из обдного столбца - это всё равно ТАБЛИЦА (!)
Следовательно мы без всякого зазрения совести можем использовать вложенный запрос в конструкции FROM вместо имени настоящей таблицы.
Итого, в твоём запросе, мы имеем два вложенных запроса (эдакая матрёшка) оба в конструкциях FROM
Разбор естественно начинаем изнутри.

_____________
Стимулятор ~yoomoney - 41001303250491
Миша
Цитата (Valick @ 16.05.2015 - 10:33)
Цитата (Медведь @ 16.05.2015 - 09:20)
В скобках начало?

да

Результатом любого запроса является таблица (хотя у меня и вышел небольшой спор по этому поводу с одним уважаемым человеком, но всё осталось на своих местах, человек уважаем, результат - таблица). Даже состоящая из одной строки, и более того даже состоящая из одной строки и из обдного столбца - это всё равно ТАБЛИЦА (!)
Следовательно мы без всякого зазрения совести можем использовать вложенный запрос в конструкции FROM вместо имени настоящей таблицы.
Итого, в твоём запросе, мы имеем два вложенных запроса (эдакая матрёшка)
Разбор естественно начинаем изнутри.

Спасибо, просто это было записано в строку и почти для меня не читаемо, результат - конечно таблица, а результат, который получаем из таблицы - уже написал.

Разобрался, почти без мануалов. (Так - более читаемо ;) )

select t.* from 

(select max(id) id from

(
select `message_ls01` userID, `message_ls02` userID2, max(id) id from `message_ls` where `message_ls01` = '$id_online' group by `message_ls01`, `message_ls02`

union all

select
`message_ls02` userID, `message_ls01` userID2, max(id) id from `message_ls` where `message_ls02` = '$id_online' group by `message_ls02`, `message_ls01`
)b

group by userID, userID2) a

left join `message_ls` t on t.id = a.id ORDER BY t.id DESC


_____________
Принимаю заказы, писать в ЛС
Valick
честно скажу не нравиться мне твой запрос с точки зрения логики
определять последнее сообщение по макс ай-ди (хотя ничего кроме таймштампа для этих целей использовать и думать нельзя) это всё равно что жарить шашлык на складе пиротехники.

_____________
Стимулятор ~yoomoney - 41001303250491
S.Chushkin
Цитата (Valick @ 16.05.2015 - 10:55)
...хотя ничего кроме таймштампа для этих целей использовать и думать нельзя...

Вы не правы.
Если или/или, то ИД с автоувеличением надёжнее.
Если "таймштамп", то +ИД обязательно ("+" жирный такой). Ибо "таймштамп" не может быть уникален, по логике.
п.с.
А запрос действительно занятный smile.gif

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Миша
Можно пример

_____________
Принимаю заказы, писать в ЛС
Valick
Цитата (S.Chushkin @ 16.05.2015 - 10:11)
Вы не правы.

время покажет
Цитата (S.Chushkin @ 16.05.2015 - 10:11)
А запрос действительно занятный

чем неправильнее архитектура БД, тем занятнее запросы biggrin.gif

_____________
Стимулятор ~yoomoney - 41001303250491
S.Chushkin
Цитата (Медведь @ 16.05.2015 - 11:15)
Можно пример

Пример чего?

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
stump
А зачем userID, userID2 в поле SELECT?

_____________
Трус не играет в хокей
Valick
stump, это алиасы, почитай условия для union и поймёшь зачем
без них union будеть сильно ругаться "матом" smile.gif

_____________
Стимулятор ~yoomoney - 41001303250491
S.Chushkin
Цитата (Valick @ 16.05.2015 - 11:15)
время покажет

Хотя, возможно Вы правы, но при условии, что timestamp с микросекундами. В этом случае вероятность, что две записи будут с тем же временем ничтожна. Если этим пренебречь, то можно сделать уник.индекс по такому полю.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Valick
S.Chushkin, для одного пользователя достаточно и секунд, не может один пользователь написать несколько сообщений с разницей в несколько микросекунд, если это не бот (а ботов мы сильно не любим). Сделать уникальность по id_user+timestamp (на оба поля сразу) не составляет труда, но с реальным пользователем такого варианта не приключится, а ботов/дедосеров можно, а иногда и нужно отлавливать задолго до БД.


_____________
Стимулятор ~yoomoney - 41001303250491
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.