ФорумРазработкаБазы данных → Сортировка пользователей по активности

Сортировка пользователей по активности

  • byvlad

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 19 июля 2011 г. 3:29

    Вообщем нужно составить запрос сортировки пользователей по активности, что-то типа этого только нормальный:
    SELECT * FROM `users` ORDER BY (SELECT COUNT(*) FROM `mems` WHERE `id_user` = что-то),(SELECT COUNT(*) FROM `mems_comments` WHERE `id_user` = что-то),(SELECT COUNT(*) FROM `mems_likes` WHERE `id_user` = чтото) DESC LIMIT 10

    помогите пожалуйста)
  • byvlad

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 19 июля 2011 г. 10:23, спустя 6 часов 54 минуты 4 секунды

    Вообщем я наверное неверно объяснил, есть 4 таблицы:

    mems:
    структура:
    id
    id_user
    и ещё ненужные поля

    mems_comments:
    структура:
    id
    id_user
    id_mems
    и ещё ненужные поля

    mems_likes:
    структура:
    id
    id_user
    id_mems
    и ещё ненужные поля.

    Нужно составить ТОП-10 самых активных пользователей исходя из количества записей в этих таблицах с приоритетом таблиц mems,mems_comments,mems_likes.

    Таблица пользователей:
    users:
    id
    login
    и ещё ненужные поля.
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 19 июля 2011 г. 10:34, спустя 11 минут 19 секунд

    ну как вариант - добавить аггрегирующие колонки в основную таблицу с пользователями, где это все будет заранее подсчитано
  • byvlad

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 19 июля 2011 г. 11:16, спустя 42 минуты 8 секунд

    был вариант, но хотелось бы обойти это…
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz 19 июля 2011 г. 11:54, спустя 37 минут 26 секунд


    был вариант, но хотелось бы обойти это…

    А зря, самый быстрый и простой вариант.
  • byvlad

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 19 июля 2011 г. 12:57, спустя 1 час 3 минуты 33 секунды

    Дали мне рабочий запрос, всем спасибо. =)
    Troy, ну я ставлю кэширование, так что думаю 0.01 не сыграют роли, а при добавлении/удалении будут лишние запросы + в таблице лишнее поле.
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 19 июля 2011 г. 13:00, спустя 2 минуты 33 секунды

    так и что там в итоге получилось-то?
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz 19 июля 2011 г. 14:54, спустя 1 час 54 минуты 1 секунду

    byvlad, ну кэширование ладно, но все же данные читают намного чаще, чем записывают.
  • byvlad

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 20 июля 2011 г. 1:19, спустя 10 часов 25 минут 2 секунды

    Абырвалг,

    SELECT `users`.*,
    (
    (SELECT COUNT(1) FROM `mems` WHERE `id_user` = `users`.`id`) +
    (SELECT COUNT(1) FROM `mems_comments` WHERE `id_user` = `users`.`id`) +
    (SELECT COUNT(1) FROM `mems_likes` WHERE `id_user` = `users`.`id`)
    ) AS `cnt`
    FROM `users`
    ORDER BY `cnt` DESC LIMIT 10
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 20 июля 2011 г. 6:59, спустя 5 часов 40 минут 28 секунд

    byvlad, это будет чудовищно тормозить. в реальной системе тебе не обойтись без заранее подготовленных "счетчиков".
    ιιlllιlllι унц-унц

Пожалуйста, авторизуйтесь, чтобы написать комментарий!