Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Сортировка из 2-х запросов SQL
Покинул форум
Сообщений всего: 15
Дата рег-ции: Нояб. 2014
Помог: 0 раз(а)
Здравствуйте, друзья!
Не знаю как мою проблему выразить на "нормальном" языке. Попытаюсь объяснить как смогу. Прошу за это сильно не ругать, и отнестись с пониманием.
# Пишу чат, верней переделываю, под новые нужды.
# Представим:
* Пользователь написал в течении 1 минуты 12 сообщений.
# Реализую так:
* В первом запросе вывожу первое сообщений, но только в цикле и по дате (т.е. вывожу все сообщения которые имеют уникальную дату добавления сообщения). А для этого использую GROUP BY. Где время идет не по секундам, а по минутам.
* Во втором запросе вывожу все сообщения, кроме первого. Но внутри первого сообщения. По принципу вкладыша - внутри главного сообщения, идут второстепенные.
# И получается:
* Если при сортировки 10 последних записей на странице, то мне ничего не выведется, если за одну минуту, было добавлено более 10 сообщений, а как в данном случаи 12 за минуту.
# Когда был черновой вариант, то я выводил без пагинации сообщений, все сообщения на 1 странице. Сейчас же я пытаюсь это дело запечь в пагинацию. Где будет выводится 10 сообщений на страницу.
# Но тут меня постигло разочарование. А именно. Если идет разбиение по страницам, и в первом запросе я использую GROUP BY, то вместо последних 10 сообщений, у меня вообще ничего (если написать более 10 сообщений за минуту). Что с точки зрение первоначальной задумке, не является верным, и поэтому ломает мне все надежды.
# И вот у меня вопрос, как же мне быть в данном случаи? Как всегда стабильно выводить 10 последних записей?
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
не используй GROUP BY
пользуй ORDER BY id/date_time DESC LIMIT 10 (Добавление)
по id быстрее конечно
незнаю зачем я вообще date_time упомянул
чисто как вариант если id не последователен
defaultNickName
Отправлено: 11 Декабря, 2014 - 10:31:09
Новичок
Покинул форум
Сообщений всего: 15
Дата рег-ции: Нояб. 2014
Помог: 0 раз(а)
LIME, если использовать ORDER BY .. DESC LIMIT 0, 10 (как я и делаю вместе с GROUP BY) то у меня происходит выборка в виде списка всего что юзер написал с разбиением по страницам. Это все хорошо. Но мне нужно использовать 2 запроса. Так как принцип вывода сообщений таков, что:
Юзер написал N количество сообщений в течении 1 минуту, к примеру больше того количество что указано в LIMIT. И возле самого сообщения, находится аватарка самого юзера. И мне не очень хочется выводить возле каждого сообщения аватарку, а хочется, чтоб после первого сообщения в каждую минуту, написанного юзером сообщения, выводилась аватарка только 1 раз в течении 1 минуты. Поэтому после первого сообщения, по принципу вкладыша, выводится второе, третье, четвертое и т.д сообщение. Поэтому я прибег к 2-м запросам.
Но это все дело работает, если не использовать разбиение по страницам.
Но как быть в данном случаи? Мне нужно лишь понять механизм, а написать sql код, у меня не составит никаких проблем. Помогите развить мысль.
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
так что тебе мешает в пыхе обрабатывать поле автора?
если оно не сменилось то не выводить авотарку
а если автор сменился то выводить
то есть сохранять аватарку в цикле в переменную
и проверять в нем же
понятно изъяснил? (Добавление)
а группировка есть неправильно в общем и целом
очень неправильно
defaultNickName
Отправлено: 11 Декабря, 2014 - 11:12:09
Новичок
Покинул форум
Сообщений всего: 15
Дата рег-ции: Нояб. 2014
Помог: 0 раз(а)
LIME, понял. Спасибо за ответ. Вопрос решен.
LIME
Отправлено: 11 Декабря, 2014 - 11:14:45
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
defaultNickName пишет:
Вопрос решен
хорошо бы отписать как решил
тему же могут потом читать в поиске решения подобной проблемы
defaultNickName
Отправлено: 12 Декабря, 2014 - 03:59:12
Новичок
Покинул форум
Сообщений всего: 15
Дата рег-ции: Нояб. 2014
WHERE `messages`.`group_time_mes` =:_group_time_mes // использовал именно такой вариант, так как он сэкономил мне код, и чтоб не использовать WHERE `user_1` = :_my_id OR `user_2` = :_my_id
AND `messages`.`status_mes` !=:_no1 // выводятся только активные сообщения
AND `messages`.`id_mes` >=:_min // вывожу все записи у которых id 10-й с конца
GROUP BY `messages`.`group_id_user_mes` // нужно именно уникальные записи выводить
$row_min['id_mes'];// это id 10-й с конца записи из базы.
Дальше идет цикл.
Внутри цикла идет еще 1 запрос, который выводит сообщения по типу вкладыша. В GROUP BY, я вывел все уникальные сообщения по временной категории. А второй цикл, вывел туда все остальные сообщения, кроме первого.
P.S. Если вкратце, то это примерно так у меня и работает. Конечно это не полный код, и в нем нету всех запросов, и всех кусков кода. Так как код у меня длинной более 200 000 символов (именно данной проблемы). А он в свою очередь, взаимодействует еще с CMS, а та в свою очередь подключена к фраимворкам, где и содержится конфиги системы.
Спасибо еще раз! Удачи всем. Тему 100% уже можно крыть.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.