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

  • 20 Ответов
  • 501 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

Здравствуйте .подскажите с запросом. Есть таблица родительская таблица - 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

Сделайте подзапрос в операторе select
интернет-блог: http://websiteprog.ru

Сделайте подзапрос в операторе select
Можно пример не делал подзапросы

*

Оффлайн zomby6888

Код: (php) [Выделить]
...
$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 '
...

чето типа того
« Последнее редактирование: 22.08.2015, 00:04:26 от zomby6888 »
интернет-блог: http://websiteprog.ru

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

*

Оффлайн saharin88

попробуйте в ордере 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

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

Запрос  с группировкой, вы это видите в конце?  .' GROUP BY s.subject_id';
интернет-блог: http://websiteprog.ru

*

Оффлайн saharin88

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

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

*

Оффлайн zomby6888

Группировку с сортировкой не путайте
интернет-блог: http://websiteprog.ru

*

Онлайн Fedor Vlasenko

  • ********
  • 3799
  • [+]704 / [-]6
  • Все начинается с Value
    • Просмотр профиля
    • Создание сайтов, поддержка сайтов

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

*

Оффлайн saharin88

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

ну так запрос мой проверяли?

*

Оффлайн zomby6888

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

ну так запрос мой проверяли?
Ваш запрос совсем не то

Здравствуйте .подскажите с запросом. Есть таблица родительская таблица - 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

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

*

Оффлайн zomby6888

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

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

Цитировать
Добавил строку после COUNT, last_user возвращает 0, хотя есть сообщения и по любому должен быть id'шник какой-то
Код: (php) [Выделить]
(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, 02:08:39 от zomby6888 »
интернет-блог: http://websiteprog.ru

Не знаю то ли я поздно сидел то ли что, вроде пробовал но написал еще раз и получилось добавил две строки после 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'

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

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

*

Оффлайн saharin88

Сколько у вас всего записей возвращается? Одна небось? :-)
До сих пор не въехали что нужно считать количество сообщений для каждой записи из 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, 02:17:32 от saharin88 »

*

Оффлайн saharin88

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

$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, 11:29:34 от saharin88 »