За последние 24 часа нас посетили 172972 программиста и 3065 роботов. Сейчас ищут 1747 программистов ...

т.н. срез значений

Тема в разделе "MySQL", создана пользователем ShamahN, 2 апр 2010.

  1. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Он говорит что не понимает какое account_id нужно.
    Нужно добавить соответствующий алиас таблицы.
     
  2. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Вот окончательный вариант:
    [sql]select `id`,t.account_id, `value`, `time_point`, t.`user_id`
    from `values` as t
    join
    (select account_id, max(`values`.time_point) as mtp from `values`
    where `values`.time_point<='2020-04-01 00:00:00' group by `account_id`) as actT
    on t.account_id=actT.account_id and t.time_point=actT.mtp[/sql]

    Осталось определиться с индексами для таблички `values` и в бой =) тестить в условиях реальности.

    Интересная задачка получилась.. не ожидал
    а условие t.time_point=actT.mtp обязательно? по ид записи никак нельзя связать? (могу неверно понимать запрос =)
     
  3. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Понекропостим немного =)
    [sql]SELECT
    accounts.id,
    accounts.account,
    providers.caption,
    counters.caption,
    clients.street,
    clients.home,
    clients.room,
    clients.responsible,
    clients.phone_number,
    vals.`value`,
    vals.time_point
    FROM
    accounts
    Left Join providers ON accounts.provider_id = providers.provider
    Left Join counters ON accounts.counter_id = counters.counter
    Left Join clients ON accounts.client_id = clients.client
    Left Join
    (SELECT `id`, t.account_id as values_acc_id, `value`, `time_point`, t.`user_id`
    FROM `values` as t
    JOIN
    (select account_id, max(`values`.time_point) as mtp from `values`
    where `values`.time_point<='2010-04-02 00:00:00' group by `account_id`) as actT
    on t.account_id=actT.account_id and t.time_point=actT.mtp) AS vals ON accounts.id=vals.values_acc_id[/sql]

    Меня пугает этот запрос =) а Вас?) не станет ли он причиной нагрузок на бд?
     
  4. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    А загнать OVER 9000 записей и погонять? :)
     
  5. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    akrinel, легко =) вот только что значит погонять?) есть ли какие-нить стандартные методы гоняния? =) тесты запросов на узкие места.. что-то у скула было на этот счет вроде
     
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Тогда этот
    http://www.php.ru/forum/viewtopic.php?t=24437
    должен вводить тебя в состояние комы.

    set profiling=1;
    и свой запрос с разными условиями.

    затем
    show profiles;

    отдельно можно сделать
    explain запрос
    и посмотреть как предполагается выборка.
     
  7. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Уже в коме =)

    Спасибо. Обязательно попробую, и отпишусь
     
  8. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Поскольку занимаюсь этим делом редко(да, да я лентяй и быдлокодер) забываю постоянно что там да как с этим профайлером, и меня выручает вот эта статья. Рекоммендую.
     
  9. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    akrinel, спс.. обязательно попробую)