Пуля — дура. Пых — молодец.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Мы в твиттере!
Мы вконтакте!
Мы на яндексе!

Краснодарское время: 25 Май, 2012, 06:22:13

Страниц: [1] 2
Печать
Автор Тема: Как сократить запрос  (Прочитано 306 раз)
0 Пользователей и 1 Гость смотрят эту тему.
lowfuck    ↓ 
13 Ноябрь, 2011, 11:16:37
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 21
Сила слова: 0

'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    ↓ 
14 Ноябрь, 2011, 04:06:42 , спустя 4 часа 50 минут 5 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 10
Сообщений: 954
Сила слова: 1.05

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

воспитываю дочь. С домами и деревьями  - не приставать.
phpdude    ↓ 
14 Ноябрь, 2011, 04:16:06 , спустя 9 минут 24 секунды
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 345
Сообщений: 20790
Сила слова: 1.66


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

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
phpdude    ↓ 
14 Ноябрь, 2011, 04:27:20 , спустя 11 минут 14 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 345
Сообщений: д-о-х-у-я!
Сила слова: 1.66

SQL

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 =)
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
lowfuck    ↓ 
14 Ноябрь, 2011, 08:57:16 , спустя 16 часов 29 минут 56 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 21
Сила слова: 0

phpdude, спасибо бро!
Записан
lowfuck    ↓ 
14 Ноябрь, 2011, 09:10:15 , спустя 12 минут 59 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 21
Сила слова: 0

Заработало так:
SQL
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    ↓ 
15 Ноябрь, 2011, 11:38:22 , спустя 14 часов 28 минут 7 секунд
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

AND YEARWEEK(`date`,3)
сколько раз твердили миру, что функций в where надо избегать например
Записан

phpdude    ↓ 
15 Ноябрь, 2011, 02:44:14 , спустя 3 часа 5 минут 52 секунды
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 345
Сообщений: д-о-х-у-я!
Сила слова: 1.66

master, почему? :-)
 
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
Nyaah    ↓ 
15 Ноябрь, 2011, 05:41:05 , спустя 2 часа 56 минут 51 секунду
НЕ ХУЕТА! ХУЕТА!

Группа: Джедаи

Карма: 34
Сообщений: 522
Сила слова: 6.51

дуд нуб )
Записан

Work, buy, consume, die
phpdude    ↓ 
15 Ноябрь, 2011, 06:12:46 , спустя 31 минуту 41 секунду
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 345
Сообщений: 20790
Сила слова: 1.66

Nyaah, ага :)
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
master    ↓ 
15 Ноябрь, 2011, 08:56:59 , спустя 2 часа 44 минуты 13 секунд
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

phpdude,
индексы не используются. сравни на любой таблице с данными
SQL
EXPLAIN SELECT * FROM `table` WHERE id=1
SQL
EXPLAIN SELECT * FROM `table` WHERE id+1=2
Записан

phpdude    ↓ 
15 Ноябрь, 2011, 10:15:27 , спустя 1 час 18 минут 28 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 345
Сообщений: д-о-х-у-я!
Сила слова: 1.66

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

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
lowfuck    ↓ 
23 Ноябрь, 2011, 11:27:29 , спустя 8 дней 1 час 12 минут 2 секунды
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 21
Сила слова: 0

EXPLAIN

Ну и как избавиться от использования функций в данном случае например?
Записан
phpdude    ↓ 
23 Ноябрь, 2011, 11:31:08 , спустя 3 минуты 39 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 345
Сообщений: 20790
Сила слова: 1.66

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

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
lowfuck    ↓ 
23 Ноябрь, 2011, 11:48:58 , спустя 17 минут 50 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 21
Сила слова: 0

phpdude, понял. Ещё вопрос:
 
Если из псевдотаблицы извлекается одно значения, я могу заапдейтить так:
SQL
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:
 
SQL
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;
 

Хуёво объяснил, надеюсь вы поняли
Записан
Страниц: [1] 2
Печать
 

Перейти в:  

Этот топик скрыли: adw0rd