Форум → Разработка → Базы данных → Как сократить запрос
Как сократить запрос
Страницы: ← Следующая страница →
-
14 ноября 2011 г. 4:06, спустя 4 часа 50 минут 5 секунд
по всей видимости писать разность сразу в таблицу из которой идет главный селект -
14 ноября 2011 г. 4:16, спустя 9 минут 24 секунды
Бредовый совет =)
по всей видимости писать разность сразу в таблицу из которой идет главный селектСапожник без сапог -
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 =)Сапожник без сапог -
-
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` -
15 ноября 2011 г. 11:38, спустя 14 часов 28 минут 7 секунд
AND YEARWEEK(`date`,3)
сколько раз твердили миру, что функций в where надо избегать напримерне всё полезно, что в swap полезло -
-
-
-
15 ноября 2011 г. 20:56, спустя 2 часа 44 минуты 13 секунд
phpdude,
индексы не используются. сравни на любой таблице с даннымиexplain select * from `table` where id=1
explain select * from `table` where id+1=2
не всё полезно, что в swap полезло -
15 ноября 2011 г. 22:15, спустя 1 час 18 минут 28 секунд
индексы не используются
спасибо кэпСапожник без сапог -
23 ноября 2011 г. 23:27, спустя 8 дней 1 час 12 минут
EXPLAIN
Ну и как избавиться от использования функций в данном случае например? -
23 ноября 2011 г. 23:31, спустя 3 минуты 39 секунд
lowfuck, подготовить данные при инсерте/апдейте. то есть завести колонку которая нужна - неделя года. и по ней выбирать :-)Сапожник без сапог -
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;
Хуёво объяснил, надеюсь вы поняли
Страницы: ← Следующая страница →
Пожалуйста, авторизуйтесь, чтобы написать комментарий!