Ответы пользователя по тегу MySQL
  • MySQL. Как сгруппировать данные по 2 полям?

    idShura
    @idShura
    не группирует по entities.id. Почему?


    Мне кажется ты не понимаеш как работает group by.
    group by используется для того, чтобы объединять повторяющиеся значения в группы. В запросе ты указываешь group by posts.id, entities.id т.е. сначала группировка происходит по полую posts.id, а затем полученные группы делятся по полю entities.id

    Покажи какую информацию выдает твой запрос.
    Ответ написан
    Комментировать
  • Как использовать GROUP BY в одном QUERY с несколькими SELECT?

    idShura
    @idShura
    SELECT `date`, COUNT(*) AS cnt, 'tot_user' as user FROM  `l_sites` GROUP BY `date`
    union all
    SELECT `date`, COUNT(*) AS cnt, 'tot_user2' as user FROM  `l_users` GROUP BY `date`
    union all
    SELECT `date`, COUNT(*) AS cnt, 'tot_user3' as user FROM  `l_leads` GROUP BY `date`
    Ответ написан
    7 комментариев
  • Заполнить отсутствующие строки SQL?

    idShura
    @idShura
    Массив дат можно создать запросом (не силен в mysql), что-то вроде этого:
    SELECT DATE_ADD('2016-08-02' ,INTERVAL help_topic_id DAY) as mydate
     FROM mysql.help_topic order by help_topic_id asc limit 14

    Затем с помощью left join подсоединить свой запрос.
    Ответ написан
    Комментировать
  • Как вырезать или вычленить текст до определённого символа sql запросом?

    idShura
    @idShura
    Похоже в Mysql нет замены регулярными выражения, поэтому написал вот этого монстра (В синтаксисе MySQL не силен) :

    SELECT case when CHARACTER_LENGTH(TEXT) - CHARACTER_LENGTH(REPLACE(TEXT, '"', '')) = 2 
                     then SUBSTRING(TEXT FROM LOCATE('"', TEXT)+1 FOR CHARACTER_LENGTH(TEXT) - LOCATE('"', TEXT)-1)
                when CHARACTER_LENGTH(TEXT) - CHARACTER_LENGTH(REPLACE(TEXT, '"', '')) = 3    
                     then SUBSTRING(TEXT FROM LOCATE('"', TEXT,LOCATE('"', TEXT)+1)+1 FOR CHARACTER_LENGTH(TEXT)-LOCATE('"', TEXT,LOCATE('"', TEXT)+1)-1 )
                when CHARACTER_LENGTH(TEXT) - CHARACTER_LENGTH(REPLACE(TEXT, '"', '')) = 4 
                     then SUBSTRING(TEXT FROM LOCATE('"', TEXT,LOCATE('"', TEXT)+1)+1 FOR CHARACTER_LENGTH(TEXT)-LOCATE('"', TEXT, LOCATE('"', TEXT,LOCATE('"', TEXT)+1)+1)-2)
                else null     
           end 
    FROM  mytable


    или так:

    select case when CHARACTER_LENGTH(TEXT) - CHARACTER_LENGTH(REPLACE(TEXT, '"', '')) = 2 
                      then SUBSTRING_INDEX(SUBSTRING_INDEX(TEXT, '"', 2), '"', -1)
                when CHARACTER_LENGTH(TEXT) - CHARACTER_LENGTH(REPLACE(TEXT, '"', '')) > 2  
                     then SUBSTRING_INDEX(SUBSTRING_INDEX(TEXT, '"', 3), '"', -1)
                else null
           end   
      FROM  mytable
    Ответ написан
    2 комментария
  • Как правильно записать SQL запрос?

    idShura
    @idShura
    MySQL:
    SELECT T.YEAR,
             SUM (CASE WHEN T.W = 1 THEN 1 ELSE 0 END) AS MEN,
             SUM (CASE WHEN T.W = 2 THEN 1 ELSE 0 END) AS WOMEN
        FROM (SELECT (YEAR(CURRENT_DATE) - YEAR(F.DR)) DIV 10 * 10 AS YEAR, F.W
                FROM DB_PERSON AS P LEFT JOIN DB_PERSON_FIO AS F ON P.ID = F.ID_PERSON
               WHERE P.STAT > 0) AS T
       
    GROUP BY T.YEAR
    ORDER BY T.YEAR;


    Шаг в 10 лет:

    1) YEAR(CURRENT_DATE) - YEAR(F.DR) - из текущей даты вычитаем дату рождения чтобы получить количество лет. (не учитывая месяцы и дни по этому такой способ не очень точный)
    2) DIV 10 * 10 - делим без остатка на 10 и затем умножаем снова на 10 чтобы получить шаг в 10 лет.

    Немного изменил:

    SELECT T.YEAR,
             SUM (CASE WHEN T.W = 1 THEN 1 ELSE 0 END) AS MEN,
             SUM (CASE WHEN T.W = 2 THEN 1 ELSE 0 END) AS WOMEN
        FROM (SELECT (DATE_FORMAT(FROM_DAYS(TO_DAYS(CURRENT_DATE) - TO_DAYS(F.DR)), '%Y') + 0) DIV 10 * 10 AS YEAR, 
                     F.W
                FROM DB_PERSON AS P LEFT JOIN DB_PERSON_FIO AS F ON P.ID = F.ID_PERSON
               WHERE P.STAT > 0) AS T
    GROUP BY T.YEAR
    ORDER BY T.YEAR;
    Ответ написан