Как организовать запрос со сравнением и в диапазоне времени

Тема в разделе "Базы данных", создана пользователем Festem, 20 ноя 2015.

Модераторы: latteo
  1. Festem

    Festem Постоялец

    Регистр.:
    4 сен 2014
    Сообщения:
    97
    Симпатии:
    26
    Помогите советом. Есть таблица постов на сайте. И надо найти 10 участников, которые оставили наиболее много постов за 60 минут, за неделю, с сохранением id этих постов.
    Т.е. кто-то 100 раз вдень, через каждых 15 минут, а кто-то постит лишь50, но все эти 50 за час. Вот мне надо те кто делает "50 за час", образно говоря
    Таблица "posts" имеет поля
    usrid | data | post | postid

    Мне кажется что одним запросом тут не отделаешься никак. Или все же реально?
     
    Последнее редактирование: 20 ноя 2015
  2. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    528
    Симпатии:
    249
    ну я конкретный запрос показать не смогу но думаю можно. Указать условие посты за нужный промежуток времени и посмотреть наиболее повторяющихся авторов лимитом в 10шт, и сохранить id постов из этой выборки.
     
  3. Festem

    Festem Постоялец

    Регистр.:
    4 сен 2014
    Сообщения:
    97
    Симпатии:
    26
    таким образом я получу тех кто постил наиболее много за неделю, например. а мне надо узнать кто за неделю постил наиболее много за 60 минут - час. причем неважно было ли это с 00:00 до 01:00 или 12:34 до 13:34
     
  4. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    528
    Симпатии:
    249
    т.е тебе нужно получить, не того человека, который за неделю напостил 10 сообщений, но он оставлял пост один раз в два часа. А ты хочешь увидеть того человека который оставил 3 сообщения в течении часа но кроме этих трех сообщений он больше ничего не постил за всю неделю?
     
  5. Festem

    Festem Постоялец

    Регистр.:
    4 сен 2014
    Сообщения:
    97
    Симпатии:
    26
    Того кто имел максимальное число постов за 60 минут любого отрезка времени - например на протяжении месяца, недели, года. Вроде на тостере подсказали решение

    Код:
    SELECT *
        FROM (
            SELECT `p1`.`usrid` AS `usrid`, COUNT(*) AS `cnt`,
                   `p1`.`data` AS `data`
                FROM `posts` AS `p1`
                JOIN `posts` AS `p2` ON `p1`.`usrid` = `p2`.`usrid`
                    AND `p2`.`data` BETWEEN `p1`.`data`
                                    AND `p1`.`data`+INTERVAL 1 HOUR
                GROUP BY `p1`.`posts`
                ORDER BY `cnt` DESC
                LIMIT 10
        ) AS `t1`
        JOIN `posts` AS `t2` ON `t1`.`usrid` = `t2`.`usrid`
            AND `t2`.`data` BETWEEN `t1`.`data`
                            AND `t1`.`data`+INTERVAL 1 HOUR
        ORDER BY `t1`.`cnt`, `t1`.`usrid`, `t2`.`data`
     
    Последнее редактирование: 24 ноя 2015
  6. Black Hat

    Black Hat Постоялец

    Регистр.:
    15 май 2015
    Сообщения:
    132
    Симпатии:
    87
    Этот запрос делах хз знает что: три самообъединения, а на выходе я так и не понял что.
    Особенно порадовало "AND `p1`.`data`+INTERVAL 1 HOUR", что всегда TRUE.
    Какой первичный ключ этой таблицы?
     
  7. Festem

    Festem Постоялец

    Регистр.:
    4 сен 2014
    Сообщения:
    97
    Симпатии:
    26
    Тем не менее запрос сделал все то что мне надо было :). Вместо +INTERVAL 1 HOUR я сделал +3600, поскольку дата в юникс формате. Первичный ключ таблицы posts
     
  8. bibika

    bibika Создатель

    Регистр.:
    30 янв 2016
    Сообщения:
    7
    Симпатии:
    1
    оно?

    select
    usrid,
    count(postid) as postCount,
    GROUP_CONCAT(`postid`) as postList ​
    from
    table ​
    where
    data between $data and $data+3600 ​
    group by
    usrid​