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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
defaultNickName
Отправлено: 11 Декабря, 2014 - 09:26:03
Post Id


Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Нояб. 2014  


Помог: 0 раз(а)




Здравствуйте, друзья!

Не знаю как мою проблему выразить на "нормальном" языке. Попытаюсь объяснить как смогу. Прошу за это сильно не ругать, и отнестись с пониманием.


# Пишу чат, верней переделываю, под новые нужды.


# Представим:
* Пользователь написал в течении 1 минуты 12 сообщений.


# Реализую так:
* В первом запросе вывожу первое сообщений, но только в цикле и по дате (т.е. вывожу все сообщения которые имеют уникальную дату добавления сообщения). А для этого использую GROUP BY. Где время идет не по секундам, а по минутам.
* Во втором запросе вывожу все сообщения, кроме первого. Но внутри первого сообщения. По принципу вкладыша - внутри главного сообщения, идут второстепенные.


# И получается:
* Если при сортировки 10 последних записей на странице, то мне ничего не выведется, если за одну минуту, было добавлено более 10 сообщений, а как в данном случаи 12 за минуту.


# Когда был черновой вариант, то я выводил без пагинации сообщений, все сообщения на 1 странице. Сейчас же я пытаюсь это дело запечь в пагинацию. Где будет выводится 10 сообщений на страницу.


# Но тут меня постигло разочарование. А именно. Если идет разбиение по страницам, и в первом запросе я использую GROUP BY, то вместо последних 10 сообщений, у меня вообще ничего (если написать более 10 сообщений за минуту). Что с точки зрение первоначальной задумке, не является верным, и поэтому ломает мне все надежды.


# И вот у меня вопрос, как же мне быть в данном случаи? Как всегда стабильно выводить 10 последних записей?


Благодарю!

(Отредактировано автором: 11 Декабря, 2014 - 09:27:25)

 
 Top
LIME
Отправлено: 11 Декабря, 2014 - 10:08:44
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




не используй GROUP BY
пользуй ORDER BY id/date_time DESC LIMIT 10
(Добавление)
по id быстрее конечно
незнаю зачем я вообще date_time упомянул
чисто как вариант если id не последователен
 
 Top
defaultNickName
Отправлено: 11 Декабря, 2014 - 10:31:09
Post Id


Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Нояб. 2014  


Помог: 0 раз(а)




LIME, если использовать ORDER BY .. DESC LIMIT 0, 10 (как я и делаю вместе с GROUP BY) то у меня происходит выборка в виде списка всего что юзер написал с разбиением по страницам. Это все хорошо. Но мне нужно использовать 2 запроса. Так как принцип вывода сообщений таков, что:

Юзер написал N количество сообщений в течении 1 минуту, к примеру больше того количество что указано в LIMIT. И возле самого сообщения, находится аватарка самого юзера. И мне не очень хочется выводить возле каждого сообщения аватарку, а хочется, чтоб после первого сообщения в каждую минуту, написанного юзером сообщения, выводилась аватарка только 1 раз в течении 1 минуты. Поэтому после первого сообщения, по принципу вкладыша, выводится второе, третье, четвертое и т.д сообщение. Поэтому я прибег к 2-м запросам.

Но это все дело работает, если не использовать разбиение по страницам.

Но как быть в данном случаи? Мне нужно лишь понять механизм, а написать sql код, у меня не составит никаких проблем. Помогите развить мысль.

Спасибо!

(Отредактировано автором: 11 Декабря, 2014 - 10:32:30)

 
 Top
LIME
Отправлено: 11 Декабря, 2014 - 10:41:20
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




так что тебе мешает в пыхе обрабатывать поле автора?
если оно не сменилось то не выводить авотарку
а если автор сменился то выводить
то есть сохранять аватарку в цикле в переменную
и проверять в нем же
понятно изъяснил?
(Добавление)
а группировка есть неправильно в общем и целом
очень неправильно
 
 Top
defaultNickName
Отправлено: 11 Декабря, 2014 - 11:12:09
Post Id


Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Нояб. 2014  


Помог: 0 раз(а)




LIME, понял. Спасибо за ответ. Вопрос решен.
 
 Top
LIME
Отправлено: 11 Декабря, 2014 - 11:14:45
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




defaultNickName пишет:
Вопрос решен
хорошо бы отписать как решил
тему же могут потом читать в поиске решения подобной проблемы
 
 Top
defaultNickName
Отправлено: 12 Декабря, 2014 - 03:59:12
Post Id


Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Нояб. 2014  


Помог: 0 раз(а)




LIME, Вот такой идет код:

PHP:
скопировать код в буфер обмена
  1. $sql = $db->prepare("
  2.                 SELECT
  3.                         `messages`.`id_mess`,
  4.                         `messages`.`text_mes`,
  5.                         `messages`.`user_mes`,
  6.                         `messages`.`user_2_mes`,
  7.                         `messages`.`user_post_mes`,
  8.                         `messages`.`group_time_mes`,
  9.                         `messages`.`group_id_user_mes`,
  10.                         `messages`.`date_mes`,
  11.                         `messages`.`time_mes`,
  12.                         `users`.`mic_avatar_user`,
  13.                         `users`.`nick_user`,
  14.                         `users`.`first_name_user`,
  15.                         `users`.`last_name_user`
  16.                 FROM
  17.                         `messages`
  18.                 JOIN
  19.                         `users`
  20.                 ON
  21.                         `users`.`id_user` = `messages`.`user_mes`
  22.                 WHERE
  23.                         `messages`.`group_time_mes` = :_group_time_mes
  24.                 AND
  25.                         `messages`.`status_mes` != :_no1
  26.                 AND
  27.                         `messages`.`id_mes` >= :_min
  28.                 GROUP BY
  29.                         `messages`.`group_id_user_mes`
  30.                 ORDER BY
  31.                         `messages`.`id_mes`
  32.                 ASC;");
  33.  
  34. $_no1 = 1;
  35. $_min = $row_min['id_mes'];
  36. $sql->bindParam(':_group_time_mes', $_group_time_mes, PDO::PARAM_STR);
  37. $sql->bindParam(':_no1', $_no1, PDO::PARAM_INT);
  38. $sql->bindParam(':_min', $_min, PDO::PARAM_INT);
  39. $sql->setFetchMode(PDO::FETCH_ASSOC);
  40. $sql->execute();


# Немного пояснения:
PHP:
скопировать код в буфер обмена
  1. WHERE `messages`.`group_time_mes` = :_group_time_mes // использовал именно такой вариант, так как он сэкономил мне код, и чтоб не использовать WHERE `user_1` = :_my_id OR `user_2` = :_my_id
  2. AND `messages`.`status_mes` != :_no1 // выводятся только активные сообщения
  3. AND `messages`.`id_mes` >= :_min // вывожу все записи у которых id 10-й с конца
  4. GROUP BY `messages`.`group_id_user_mes` // нужно именно уникальные записи выводить
  5. $row_min['id_mes']; // это id 10-й с конца записи из базы.


Дальше идет цикл.
Внутри цикла идет еще 1 запрос, который выводит сообщения по типу вкладыша. В GROUP BY, я вывел все уникальные сообщения по временной категории. А второй цикл, вывел туда все остальные сообщения, кроме первого.

P.S. Если вкратце, то это примерно так у меня и работает. Конечно это не полный код, и в нем нету всех запросов, и всех кусков кода. Так как код у меня длинной более 200 000 символов (именно данной проблемы). А он в свою очередь, взаимодействует еще с CMS, а та в свою очередь подключена к фраимворкам, где и содержится конфиги системы.

Спасибо еще раз! Удачи всем. Тему 100% уже можно крыть.

(Отредактировано автором: 12 Декабря, 2014 - 04:01:29)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB