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

Форум MySQL

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

 

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

вид форума:
Линейный форум Структурный форум

тема: группировка по возрасту
 
 автор: Моя тень   (28.08.2010 в 19:41)   письмо автору
 
 



  SELECT  
      spid_epid_social_data.date_birth,
      FLOOR( ( CURDATE() - DATE(`date_birth`) ) / 10000 ) AS `age`,  
      COUNT(*) AS cnt
  FROM
      spid_epid_perosn
  LEFT JOIN
      spid_epid_social_data USING(id_person)
  GROUP BY age




Мне нужно сделать группировку по полю age, только с некоторым условием. нужно сгруппировать так. От 0-16 лет, от 16-18,от 18 и более.
Можно липридумать что-то средствами mysql?

  Ответить  
 
 автор: .....   (29.08.2010 в 11:21)
 
   для: Моя тень   (28.08.2010 в 19:41)
 

в ORDER BY можно просто ставить условие, типа
ORDER BY age%18

GROUP BY работает только с именами столбцов результата
т.е. если SELECT tabl.*, (age%18) FROM ....
то GROUP BY '(age%18)' работать будет, хоть и коряво выглядит.

учитывая
>FLOOR( ( CURDATE() - DATE(`date_birth`) ) / 10000 ) AS `age`
и то что ещё нужно добавить , будет выглядеть ещё корявее :)

  Ответить  
 
 автор: .....   (29.08.2010 в 11:27)
 
   для: Моя тень   (28.08.2010 в 19:41)
 

если память не изменяет, даже алиасы нельзя подсунуть
, т.е (1+1) AS dwa ? , так и будет GROUP BY '(1+1) AS dwa'

  Ответить  
 
 автор: Trianon   (29.08.2010 в 11:39)   письмо автору
 
   для: .....   (29.08.2010 в 11:27)
 

но можно задать сложный запрос с определением столбика (и алиаса) во внутреннем, и группировкой по алиасу - во внешнем.
Причем выражение может быть не только арифметическим, но и условным (так что кусочно линеную функцию вполне можно задать - CASE ... THEN ... и т.д.)

кстати, свежие версии сервера не требуют такого изврата, и позволяют обходиться алиасом в GROUP BY (b соответственно одним уровнем SELECT)

ps. Вы бы зарегистрировались чтоли...

  Ответить  
 
 автор: Моя тень   (29.08.2010 в 12:07)   письмо автору
 
   для: Trianon   (29.08.2010 в 11:39)
 

>но можно задать сложный запрос с определением столбика (и алиаса) во внутреннем, и группировкой по алиасу - во внешнем.
>Причем выражение может быть не только арифметическим, но и условным (так что кусочно линеную функцию вполне можно задать - CASE ... THEN ... и т.д.)
>
Trianon, покажите пожалуйста наглядно как так можно сделать?

  Ответить  
 
 автор: heed   (29.08.2010 в 12:42)   письмо автору
 
   для: Моя тень   (29.08.2010 в 12:07)
 

:)

непонятно что в результате хотите получить

>по полю age, только с некоторым условием. нужно сгруппировать так. От 0-16 лет, от 16-18,от 18 и более.
звучит как отсортировать.
Или имеете ввиду нужно три ряда с первой записью и подсчётами колличества записей отвечающих условию ?

  Ответить  
 
 автор: Моя тень   (29.08.2010 в 14:59)   письмо автору
 
   для: heed   (29.08.2010 в 12:42)
 

Если правильно понял, то да. Вот вообщем примерно какой должен быть результ
0-16 | 30
16-18| 50
18 и более | 60

Тоесть в результате получится 3 записи с количеством людей.

  Ответить  
 
 автор: Trianon   (29.08.2010 в 16:37)   письмо автору
 
   для: Моя тень   (29.08.2010 в 12:07)
 

если дозволена группировка по алиасу
SELECT COUNT(*) AS cnt, 
    case when years < 16 then 0 when years < 18 then 1 else 2 end 
      AS kind , 
    MIN(`years`) AS `miy`,
    MAX(`years`) AS `may`
  FROM(
  SELECT  FLOOR((DATEDIFF(CURDATE(), `bday`)/365.25)) as years
     FROM `birth` 
  ) as t
GROUP BY kind 


если не дозволена -
SELECT 
    COUNT(*) AS cnt, kind, 
      MIN(`years`) AS `miy`,
      MAX(`years`) AS `may`
    FROM(
  SELECT     
        years, 
            case when years < 16 then 0 when years < 18 then 1 else 2 end 
           AS kind 
    FROM(
    SELECT  
            FLOOR((DATEDIFF(CURDATE(), `bday`)/365.25)) as years
      FROM `birth` 
    ) as t1    
  ) as t2
GROUP BY kind 

  Ответить  
 
 автор: Моя тень   (29.08.2010 в 22:51)   письмо автору
 
   для: Trianon   (29.08.2010 в 16:37)
 

Спасибо! Оба запроса подошли.

  Ответить  
Rambler's Top100
вверх

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