Форум русской поддержки Joomla!® CMS
11.12.2016, 00:28:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Последнюю запись в подчиненой таблице

 (Прочитано 357 раз)
0 Пользователей и 1 Гость смотрят эту тему.
spirit1086
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 135


« : 21.08.2015, 21:43:52 »

Здравствуйте .подскажите с запросом. Есть таблица родительская таблица - Subject, подчиненная ей messages. Запросом я вытаскиваю все Subject по определенной категории и подсчитываю сколько message в каждой subject, мне нужно добавить запрос чтобы получить автора последнего message
Код:
$db = JFactory::getDbo();
       $query = $db->getQuery(true);
       $query='SELECT s.*,COUNT(DISTINCT m.message_id) AS count_messages, '
              .' FROM #__subjects AS s'
              .' LEFT JOIN #__messages AS m ON s.subject_id=m.subject_id'
              .' WHERE s.category_id='.(int)$category_id.' AND m.state=1 AND s.state=1'
              .' GROUP BY s.subject_id';
       $db->setQuery($query);
       $category_subjects = $db->loadAssocList();
      
 
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #1 : 21.08.2015, 22:07:36 »

Сделайте подзапрос в операторе select
Записан
spirit1086
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 135


« Ответ #2 : 21.08.2015, 22:22:00 »

Сделайте подзапрос в операторе select
Можно пример не делал подзапросы
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #3 : 21.08.2015, 22:55:46 »

Код
...
$query='SELECT s.*,COUNT(DISTINCT m.message_id) AS count_messages,
(SELECT author_id FROM #__messages WHERE subject_id=s.subject_id  ORDER by message_id DESC LIMIT 1) as last_msg_author '

...
 

чето типа того
« Последнее редактирование: 21.08.2015, 23:04:26 от zomby6888 » Записан
spirit1086
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 135


« Ответ #4 : 21.08.2015, 23:29:20 »

выдал что Неправильный синтаксис не пойму вроде ваш подзапрос подходит
Записан
saharin88
Давно я тут
****

Репутация: +15/-1
Offline Offline

Пол: Мужской
Сообщений: 248


joom.work


« Ответ #5 : 21.08.2015, 23:29:47 »

попробуйте в ордере ASC (возможно DESC), по идее должен подтянуться автор последний по ордеру
Код:
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('s.*,COUNT(DISTINCT m.message_id) AS count_messages, m.message_autor');
$query->from('FROM #__subjects AS s');
$query->leftJoin('#__messages AS m ON (s.subject_id=m.subject_id)');
$query->where('s.category_id='.(int)$category_id);
$query->where('m.state=1');
$query->where('s.state=1');
$query->group('s.subject_id');
$query->order('m.message_id ASC');
$db->setQuery($query);
$category_subjects = $db->loadAssocList();
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #6 : 21.08.2015, 23:53:28 »

попробуйте в ордере ASC (возможно DESC), по идее должен подтянуться автор последний по ордеру

Запрос  с группировкой, вы это видите в конце?  .' GROUP BY s.subject_id';
Записан
saharin88
Давно я тут
****

Репутация: +15/-1
Offline Offline

Пол: Мужской
Сообщений: 248


joom.work


« Ответ #7 : 22.08.2015, 00:12:26 »

Запрос  с группировкой, вы это видите в конце?  .' GROUP BY s.subject_id';
ну все правильно, групирует по ид темы и присоединяет автора из последней row, а так как у нас order ASC по ид сообщения, значит возьмет автора с row у которого наибольший ид
единственный минус это сортировка тем будет по такому же принципу

я не уверен насчет правильности запроса, но должно прокатить такое, а если нет, то да, только внутренний SELECT, каквы написали выше
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #8 : 22.08.2015, 00:29:03 »

Группировку с сортировкой не путайте
Записан
Fedor Vlasenko
Профи
********

Репутация: +696/-5
Offline Offline

Пол: Мужской
Сообщений: 3820


Все начинается с Value


« Ответ #9 : 22.08.2015, 00:30:02 »

Код
SELECT `t`.*, ...
FROM
(SELECT
.......) AS `t`
JOIN .... ON .............
WHERE ....................;
 
Записан
spirit1086
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 135


« Ответ #10 : 22.08.2015, 00:32:08 »

Группировка для того чтобы подсчитать количество записей в каждой теме, и нужно получить последнюю строку каждой темы
Записан
saharin88
Давно я тут
****

Репутация: +15/-1
Offline Offline

Пол: Мужской
Сообщений: 248


joom.work


« Ответ #11 : 22.08.2015, 00:33:30 »

Группировка для того чтобы подсчитать количество записей в каждой теме, и нужно получить последнюю строку каждой темы

ну так запрос мой проверяли?
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #12 : 22.08.2015, 00:35:46 »

Да не будет ваш запрос работать, это очевидно, вы понимаете что тут джоин с группировкой используется чтобы записи подсчитать?
без count ваш запрос вернут кучу записей так как на каждый subject_id будет присоеденяться по каждой записи из таблицы messages, ну а используемый оператор count  в такой записи вообще сделает так что вернется только одна запись  Smiley
http://stackoverflow.com/questions/4082713/mysql-returns-only-one-row-when-using-count
« Последнее редактирование: 22.08.2015, 00:46:00 от zomby6888 » Записан
spirit1086
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 135


« Ответ #13 : 22.08.2015, 00:47:24 »

ну так запрос мой проверяли?
Ваш запрос совсем не то
Записан
spirit1086
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 135


« Ответ #14 : 22.08.2015, 00:52:13 »

Здравствуйте .подскажите с запросом. Есть таблица родительская таблица - Subject, подчиненная ей messages. Запросом я вытаскиваю все Subject по определенной категории и подсчитываю сколько message в каждой subject, мне нужно добавить запрос чтобы получить автора последнего message
Код:
$db = JFactory::getDbo();
       $query = $db->getQuery(true);
       $query='SELECT s.*,COUNT(DISTINCT m.message_id) AS count_messages,(SELECT user_id FROM #__esforum_messages ORDER BY message_id  LIMIT 1) AS last_user '
              .' FROM #__subjects AS s'
              .' LEFT JOIN #__messages AS m ON s.subject_id=m.subject_id'
              .' WHERE s.category_id='.(int)$category_id.' AND m.state=1 AND s.state=1'
              .' GROUP BY s.subject_id';
       $db->setQuery($query);
       $category_subjects = $db->loadAssocList();
       
   
Добавил строку после COUNT, last_user возвращает 0, хотя есть сообщения и по любому должен быть id'шник какой-то
Код:
(SELECT user_id FROM #__esforum_messages ORDER BY message_id  LIMIT 1) AS last_user
Записан
saharin88
Давно я тут
****

Репутация: +15/-1
Offline Offline

Пол: Мужской
Сообщений: 248


joom.work


« Ответ #15 : 22.08.2015, 00:57:34 »

проверил свой запрос!
count  возвращает правильный, а вот autor_id берет из первой попавшейся записи!
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #16 : 22.08.2015, 01:05:05 »

проверил свой запрос!
count  возвращает правильный, а вот autor_id берет из первой попавшейся записи!

Сколько у вас всего записей возвращается? Одна небось? :-)
До сих пор не въехали что нужно считать количество сообщений для каждой записи из subject?

Цитировать
Добавил строку после COUNT, last_user возвращает 0, хотя есть сообщения и по любому должен быть id'шник какой-то
Код
(SELECT user_id FROM `#__esforum_messages` ORDER BY message_id DESC LIMIT 1) AS last_user
 

DESC пропустили?
Выполните этот запрос (SELECT user_id FROM `#__esforum_messages` ORDER BY message_id DESC LIMIT 1) сначало отдельно и посмотрите что вернет. Если все хорошо то вставьте его как подзапрос. Нет, так смотрите в чем ошибка.
« Последнее редактирование: 22.08.2015, 01:08:39 от zomby6888 » Записан
spirit1086
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 135


« Ответ #17 : 22.08.2015, 01:07:25 »

Не знаю то ли я поздно сидел то ли что, вроде пробовал но написал еще раз и получилось добавил две строки после count

Код:
'(SELECT message_time FROM #__messages WHERE subject_id=s.subject_id ORDER BY message_id DESC LIMIT 1) AS last_time,'
 '(SELECT user_id FROM #__messages WHERE subject_id=s.subject_id ORDER BY message_id DESC LIMIT 1) AS last_user'
Записан
spirit1086
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 135


« Ответ #18 : 22.08.2015, 01:08:56 »

Сколько у вас всего записей возвращается? Одна небось? :-)
До сих пор не въехали что нужно считать количество сообщений для каждой записи из subject?
Код
(SELECT user_id FROM `#__esforum_messages` ORDER BY message_id DESC LIMIT 1) AS last_user
 

DESC пропустили?
Выполните этот запрос сначало отдельно и посмотрите что вернет. Если все хорошо то вставьте его как подзапрос.
А мне и надо чтобы в переменой last_user был id юзера последней строки
Записан
saharin88
Давно я тут
****

Репутация: +15/-1
Offline Offline

Пол: Мужской
Сообщений: 248


joom.work


« Ответ #19 : 22.08.2015, 01:11:02 »

Сколько у вас всего записей возвращается? Одна небось? :-)
До сих пор не въехали что нужно считать количество сообщений для каждой записи из subject?

та все я вьехал, не умничайте, темы две сообщений 4 по два на тему

П.С Можно получить время последнего сообщения:

Код:
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('s.*,COUNT(DISTINCT m.message_id) AS count_messages, MAX(m.time) AS last_time');
$query->from('FROM #__subjects AS s');
$query->leftJoin('#__messages AS m ON (s.subject_id=m.subject_id)');
$query->where('s.category_id='.(int)$category_id);
$query->where('m.state=1');
$query->where('s.state=1');
$query->group('s.subject_id');
$db->setQuery($query);
$category_subjects = $db->loadAssocList();

а ид автора получается только подзапросом
« Последнее редактирование: 22.08.2015, 01:17:32 от saharin88 » Записан
saharin88
Давно я тут
****

Репутация: +15/-1
Offline Offline

Пол: Мужской
Сообщений: 248


joom.work


« Ответ #20 : 22.08.2015, 01:35:40 »

Есть, но это конечно извращения )

Код:
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('s.*,COUNT(DISTINCT m.message_id) AS count_messages, SUBSTRING_INDEX(GROUP_CONCAT(m.autor_id ORDER BY m.time DESC), ',', 1) AS last_msg_author');
$query->from('FROM #__subjects AS s');
$query->leftJoin('#__messages AS m ON (s.subject_id=m.subject_id)');
$query->where('s.category_id='.(int)$category_id);
$query->where('m.state=1');
$query->where('s.state=1');
$query->group('s.subject_id');
$db->setQuery($query);
$category_subjects = $db->loadAssocList();
« Последнее редактирование: 22.08.2015, 10:29:34 от saharin88 » Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet