Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Группировка в таблице

Сообщения:  [1-10]   [11-12] 

 
 автор: Trianon   (13.12.2009 в 13:02)   письмо автору
 
   для: Aramor   (13.12.2009 в 12:06)
 

а автоинкрементный первичный ключ в таблице сообщений есть?
Лучше ориентироваться на него, а не на дату.

SELECT
  `message`.`from_user` as `contact`,
  count(*) AS `cnt_message`,
  sum(`read` = '0') AS `cnt_not_read`,
  max(id) AS `last_id`
FROM
  `message`
WHERE
  `message`.`to_user` = '180' 
GROUP BY
  `message`.`from_user` 

ну и дальше подсоединить таблицу JOINом по условию равенства ключей.
SELECT ..., m.date_ins , SUBSTRING(m.`text`...) 
  FROM 
    (
      SELECT ...
    ) AS p
     JOIN messages AS m ON p.last_id = m.id

  Ответить  
 
 автор: Aramor   (13.12.2009 в 12:06)   письмо автору
 
   для: Trianon   (13.12.2009 в 11:53)
 

Хорошо, а как можно сделать тогда?

  Ответить  
 
 автор: Trianon   (13.12.2009 в 11:53)   письмо автору
 
   для: Aramor   (13.12.2009 в 09:14)
 

Нельзя указывать в списке SELECT негруппирующие поля, кроме тех что в аргументах агрегатных функций.
SUBSTRING - функция обычная, неагрегатная.

  Ответить  
 
 автор: Aramor   (13.12.2009 в 09:14)   письмо автору
 
   для: Aramor   (12.12.2009 в 06:18)
 

Написал вот такой запрос:

SELECT `new_table`.`contact`, SUM(cnt_message) AS `cnt_message`, `new_table`.`cnt_not_read`, `new_table`.`last_message`, `new_table`.`last_message_text` 
FROM (
(SELECT
  `message`.`from_user` as `contact`,
  count(*) AS `cnt_message`,
  sum(`read` = '0') AS `cnt_not_read`,
  max(date_ins) AS `last_message`,
  SUBSTRING(`text`,1,20) as `last_message_text`
FROM
  `message`
WHERE
  `message`.`to_user` = '180' 
GROUP BY
  `message`.`from_user`)
UNION
(SELECT
  `message`.`to_user` as `contact`,
  count(*) AS `cnt_message`,
  sum(`read` = '0') AS `cnt_not_read`,
  max(date_ins) AS `last_message`,
  SUBSTRING(`text`,1,20) as `last_message_text`
FROM
  `message`
WHERE
  `message`.`from_user` = '180' 
GROUP BY
  `message`.`to_user`)
) AS `new_table` GROUP BY `new_table`.`contact` ORDER BY `last_message` DESC;

Но есть маленькая загвоздка: не могу понять, как взять текст именно последнего собщения данного контакта.

SELECT
  `message`.`from_user` as `contact`,
  count(*) AS `cnt_message`,
  sum(`read` = '0') AS `cnt_not_read`,
  max(date_ins) AS `last_message`,
  SUBSTRING(`text`,1,20) as `last_message_text`
FROM
  `message`
WHERE
  `message`.`to_user` = '180' 
GROUP BY
  `message`.`from_user`

т.е. дата берётся последнего сообщения, а текст сообщения первого попавшегося. А нужно. чтобы текст брался того сообщения, которое последнее. Подскажиет пожалуйсто.

  Ответить  
 
 автор: Aramor   (12.12.2009 в 16:58)   письмо автору
 
   для: Trianon   (12.12.2009 в 16:27)
 

Вот запрос для исходящих:
SELECT   
  `message`.`to_user`,  
  count(*) AS `cnt`,  
  max(date_ins) AS `last_message`,  
  sum(`read` = false) AS `cnt_not_read`  
FROM  
  `message`  
WHERE  
  `from_user` = '180' 
GROUP BY  
  `message`.`to_user`


Результат:
to_user___________cnt_________last_message______cnt_not_read
  25_____________2__________09.12.2009 23:42________0
  26_____________1__________08.12.2009 23:42________1

Вот запрос для входящих:
SELECT   
  `message`.`from_user`,  
  count(*) AS `cnt`,  
  max(date_ins) AS `last_message`,  
  sum(`read` = false) AS `cnt_not_read`  
FROM  
  `message`  
WHERE  
  `to_user` = '180' 
GROUP BY  
  `message`.`from_user`


Результат:
from_user_____cnt___last_message____cnt_not_read
  21_________2___07.12.2009 23:42______2
  25_________1___11.12.2009 15:33______1
  30_________1___06.12.2009 23:42______1

  Ответить  
 
 автор: Trianon   (12.12.2009 в 16:53)   письмо автору
 
   для: Trianon   (12.12.2009 в 16:27)
 

И таки да. Полного внешнего соединения (FULL OUTER JOIN) в MySQL нету. А посему вариант с двумя независимыми запросами (и формированием FULL OUTER JOIN средствами php) оказывается предпочтительным.

  Ответить  
 
 автор: Trianon   (12.12.2009 в 16:27)   письмо автору
 
   для: Aramor   (12.12.2009 в 15:55)
 

Насчет результат такой же - враки.

Спешите... Сказал же - сперва один запрос! Потом только - другой.
Вот это у Вас запрос для исходящих. Так?

SELECT  
  `message`.`from_user`, 
  `message`.`to_user`, 
  count(*) AS `cnt`, 
  max(date_ins) AS `last_message`, 
  sum(case `read` when true then 0 else 1 end) AS `cnt_not_read` 
FROM 
  `message` 
WHERE 
  `from_user` = '180'
GROUP BY 
  `message`.`to_user`

Если убрать `message`.`from_user` из SELECT то будет вполне себе симпатично. Ну еще агрегат в sum() можно попроще написать. sum(`read` = false)

  Ответить  
 
 автор: Aramor   (12.12.2009 в 15:55)   письмо автору
 
   для: Trianon   (12.12.2009 в 12:28)
 

Написал вот аткой запрос, но результат такой же. как и у предыдущего

(SELECT  
  `message`.`from_user`, 
  `message`.`to_user`, 
  count(*) AS `cnt`, 
  max(date_ins) AS `last_message`, 
  sum(case `read` when true then 0 else 1 end) AS `cnt_not_read` 
FROM 
  `message` 
WHERE 
  `from_user` = '180'
GROUP BY 
  `message`.`to_user`)
UNION ALL
(SELECT  
  `message`.`from_user`, 
  `message`.`to_user`, 
  count(*) AS `cnt`, 
  max(date_ins) AS `last_message`, 
  sum(case `read` when true then 0 else 1 end) AS `cnt_not_read` 
FROM 
  `message` 
WHERE 
  `to_user` = '180'
GROUP BY 
  `message`.`from_user`)


не понимаю как логически это релизовать

  Ответить  
 
 автор: Trianon   (12.12.2009 в 12:28)   письмо автору
 
   для: Aramor   (12.12.2009 в 12:25)
 

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

  Ответить  
 
 автор: Aramor   (12.12.2009 в 12:25)   письмо автору
 
   для: Trianon   (12.12.2009 в 11:40)
 

Что для вас очевидно - для меня тайна, покрытая мраком. Не могли бы помочь запросиком?

  Ответить  

Сообщения:  [1-10]   [11-12] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования