ФорумРазработкаБазы данных → Как сократить запрос

Как сократить запрос

  • lowfuck

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

    Spritz 13 ноября 2011 г. 23:16

    'SELECT (SELECT SUM(`amount`) FROM `balance_operations` WHERE `type` = 3 AND YEARWEEK(`date`,3) = YEARWEEK(NOW(),3) AND `user_id` = 1) - (SELECT SUM(`amount`) FROM `balance_operations` WHERE `type` = 4 AND YEARWEEK(`date`,3) = YEARWEEK(NOW(),3) AND `user_id` = 1) AS `diff`'

    Как сократить эту хуиту?
  • Faster

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

    Spritz 14 ноября 2011 г. 4:06, спустя 4 часа 50 минут 5 секунд

    по всей видимости писать разность сразу в таблицу из которой идет главный селект
  • phpdude

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

    Spritz 14 ноября 2011 г. 4:16, спустя 9 минут 24 секунды


    по всей видимости писать разность сразу в таблицу из которой идет главный селект
    Бредовый совет =)
    Сапожник без сапог
  • phpdude

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

    Spritz 14 ноября 2011 г. 4:27, спустя 11 минут 14 секунд


    SELECT SUM('amount') `diff` FROM (
    SELECT IF(`type` = 3, `amount`, -`amount`) `diff` FROM `balance_operations` WHERE
    `type` IN (3,4) AND YEARWEEK(`date`,3) = YEARWEEK(NOW(),3) AND `user_id` = 1
    ) `total`
    Думаю как то так будет работать =)

    из плюса - не надо будет дважды таблицу проходить как у тебя в примере :-)
    ну и если проставить индекс по всем колонкам которые есть в запросе, то думаю будет работать очень быстро на почти любых размерах базы. но тут конечно надо проверять и explain =)
    Сапожник без сапог
  • lowfuck

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

    Spritz 14 ноября 2011 г. 20:57, спустя 16 часов 29 минут 56 секунд

    phpdude, спасибо бро!
  • lowfuck

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

    Spritz 14 ноября 2011 г. 21:10, спустя 12 минут 59 секунд

    Заработало так:
    SELECT SUM(`diff`) `diff` FROM (
    SELECT IF(`type` = 3, `amount`, -`amount`) `diff` FROM `balance_operations` WHERE
    `type` IN (3,4) AND YEARWEEK(`date`,3) = YEARWEEK(NOW(),3) AND `user_id` = 1
    ) `total`
  • master

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

    Spritz 15 ноября 2011 г. 11:38, спустя 14 часов 28 минут 7 секунд

    AND YEARWEEK(`date`,3)

    сколько раз твердили миру, что функций в where надо избегать например
    не всё полезно, что в swap полезло
  • phpdude

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

    Spritz 15 ноября 2011 г. 14:44, спустя 3 часа 5 минут 52 секунды

    master, почему? :-)

    Сапожник без сапог
  • Nyaah

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

    Spritz 15 ноября 2011 г. 17:41, спустя 2 часа 56 минут 51 секунду

    дуд нуб )
    Work, buy, consume, die
  • phpdude

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

    Spritz 15 ноября 2011 г. 18:12, спустя 31 минуту 41 секунду

    Nyaah, ага :)
    Сапожник без сапог
  • master

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

    Spritz 15 ноября 2011 г. 20:56, спустя 2 часа 44 минуты 13 секунд

    phpdude,
    индексы не используются. сравни на любой таблице с данными
    explain select * from `table` where id=1

    explain select * from `table` where id+1=2
    не всё полезно, что в swap полезло
  • phpdude

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

    Spritz 15 ноября 2011 г. 22:15, спустя 1 час 18 минут 28 секунд

    индексы не используются

    спасибо кэп
    Сапожник без сапог
  • lowfuck

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

    Spritz 23 ноября 2011 г. 23:27, спустя 8 дней 1 час 12 минут

    EXPLAIN


    Ну и как избавиться от использования функций в данном случае например?
  • phpdude

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

    Spritz 23 ноября 2011 г. 23:31, спустя 3 минуты 39 секунд

    lowfuck, подготовить данные при инсерте/апдейте. то есть завести колонку которая нужна - неделя года. и по ней выбирать :-)
    Сапожник без сапог
  • lowfuck

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

    Spritz 23 ноября 2011 г. 23:48, спустя 17 минут 50 секунд

    phpdude, понял. Ещё вопрос:

    Если из псевдотаблицы извлекается одно значения, я могу заапдейтить так:
    UPDATE `stat` SET `profit_rur` = (SELECT SUM(`diff`)*0.5 FROM (
    SELECT IF(`type` = 3, `amount`, -`amount`) AS `diff` FROM `balance_operations` WHERE
    `type` IN (3,4) AND YEARWEEK(`date`,3) = YEARWEEK(NOW(),3) AND `currency` = "rur" AND `user_id` = 1
    ) AS `total`) WHERE `user_id` = 1;


    Но как мне быть, если я хочу заапдейтить сразу 2:

    SELECT SUM(`diff_rur`)*0.5 `total_rur`, SUM(`diff_usd`)*0.5 `total_usd` FROM (
    SELECT IF(`currency` = 'rur', IF(`type` = 3, `amount`, -`amount`), 0) AS `diff_rur`,
    IF(`currency` = 'usd', IF(`type` = 3, `amount`, -`amount`), 0) AS `diff_usd`
    FROM `balance_operations` WHERE
    `type` IN (3,4) AND YEARWEEK(`date`,3) = YEARWEEK(NOW(),3) AND `user_id` = 1
    ) AS `total`;
    UPDATE `stat` SET `profit_rur` = `total_rur`, `profit_usd` = `total_usd` WHERE `user_id` = 1;


    Хуёво объяснил, надеюсь вы поняли

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