IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Веб-программирование (http://www.imho.ws/forumdisplay.php?f=29)
-   -   вопрос по поводу mysql (http://www.imho.ws/showthread.php?t=107024)

uerter 14.08.2006 14:18

вопрос по поводу mysql
 
можно ли средствами mysql сделать следующее
у нас есть поля start, end, total
формата: 00:00:00 ну истественно end-start=total
так вот ... можно ли при помощи запроса заново пересчитать total?

Naked 14.08.2006 14:25

если правильно понял:
UPDATE table SET total=end-start

uerter 14.08.2006 14:37

да .. если бы там был формат просто int то да ...
а тут формат данных 00:00:00 ... при запросе ничего не апдейтится ...
вот запрос

update `Hourregistration` set `H-totaltime`=`H-endtime`-`H-starttime` where `H-ID`='206573'


start = 11:55:00
end = 12:44:00
в total записывается нули 00:00:00

значит не все так уж нормально работает ....
можно было бы все это при помощи РНР сделать ... но мне надо именно при помощи запроса

Naked 14.08.2006 14:43

только что создал таблицу, тип TIME, begin = 09:00:00, end = 12:00:00
UPDATE test SET total = begin - end

в итоге в total записано -03:00:00

Проверь свой H-ID

uerter 14.08.2006 14:49

:yees: ты прав ... фенкс

smap 14.08.2006 14:58

Хотел предложить такое:
UPDATE test SET total = SEC_TO_TIME( TIME_TO_SEC( end ) - TIME_TO_SEC( begin ) )
ну если предыдущие получилось, тогда ето лишнее :/

uerter 14.08.2006 15:27

о! это вариант интересный! респект тебе!

тут еше одн вопрос возник ..
вернемся к тому же total
в табле Hourregistration хочу просумировать все total и записать их в другую ...одним запросом можно?

smap 14.08.2006 15:53

Кажись что то в этом роде:
UPDATE table_sum_total SET sum_total = SUM( Hourregistration.total )

uerter 14.08.2006 16:34

UPDATE `Hourregistration` ,
`Students` SET `Students`.`ST-TotalESFHours` = SUM( `Hourregistration`.`H-totaltime` ) WHERE `Hourregistration`.`H-ST-ID` = '61' && `Hourregistration`.`H-esf` = '1' && `Students`.`ST-ID` = '61'

Ответ MySQL: Документация
#1111 - Invalid use of group function

сделал следующее
Цитата:

UPDATE `Students` SET `ST-TotalESFHours` = ( SELECT SUM( `H-totaltime` )
FROM `Hourregistration`
WHERE `H-ST-ID` = '64' )
WHERE `ST-ID` = '64'
но вложеные запросы мне не очень нравятся ... можно ли оптимизировать ?

Hubbitus 15.08.2006 10:24

Цитата:

uerter:
но вложеные запросы мне не очень нравятся ... можно ли оптимизировать ?
В данном случае это всеравно 2 запроса должно быть, если не нравится вложенный (с чего бы вдруг кстати?), то можно сначала сохранить сумму в переменную, а потом ее записать. Но не вижу смысла этого делать, если со вложенным работает - с ним логичнее и нагляднее.

uerter 15.08.2006 18:07

хм .... да но вложеные запросы лучше избегать ... так как они жутко все тормозят

возвращаемся к нашим баранам ))
Цитата:

select DISTINCT SQL_CALC_FOUND_ROWS `H-date` from `Hourregistration` where `H-deleted`='1' && `H-G-ID`='14'
возвращается список H-date
дальше по каждому H-date я делаю следующее
Цитата:

select SQL_CALC_FOUND_ROWS * from `Hourregistration` where `H-deleted`='1' && `H-G-ID`='14' && `H-date`='2005-09-07'
Цитата:

select sec_to_time(sum(time_to_sec(`H-totaltime`))) from `Hourregistration` where `H-deleted`='1' && `H-G-ID`='14' && `H-date`='2005-09-07' && `H-esf`=1
Цитата:

select sec_to_time(sum(time_to_sec(`H-totaltime`))) from `Hourregistration` where `H-deleted`='1' && `H-G-ID`='14' && `H-date`='2005-09-07' && `H-esf`=0
все это затягивается на 1.5 - 2 сек ... сами запросы ... как обьеденить никто не подскажет?

с разу говорю ... дело идет о тысечах записей ...

можно ли что-то такое сделать как for each ну или чо-то в роде того в самом запросе

Hubbitus 24.08.2006 13:39

Цитата:

uerter:
хм .... да но вложеные запросы лучше избегать ... так как они жутко все тормозят
Не больше чем 2 таких же запроса последовательно.

Цитата:

uerter:
возвращаемся к нашим баранам ))
Ну что-то подобное должно быть:
Код:

SELECT DISTINCT h2.*,
        (
        SELECT sum(`H-totaltime`)
        FROM `Hourregistration` as h3
        WHERE        h3.`H-deleted`='1'
                AND h3.`H-G-ID`=h1.`H-G-ID`
                AND h3.`H-date`=h1.`H-date`
                AND h3.`H-esf`=1
        ) as `Sum1_H_esf1`,
        (
        SELECT sum(`H-totaltime`)
        FROM `Hourregistration` as h3
        WHERE        h3.`H-deleted`='1'
                AND h3.`H-G-ID`=h1.`H-G-ID`
                AND h3.`H-date`=h1.`H-date`
                AND h3.`H-esf`=0
        ) as `Sum2_H_esf0`
FROM        `Hourregistration`as h1 INNER JOIN
        `Hourregistration`as h2 ON (h2.`H-date` = h1.`H-date` AND h2.`H-deleted` = '1' AND h2.`H-G-ID`=h1.`H-G-ID`)
WHERE h1.`H-deleted`='1' && h1.`H-G-ID`='14'


Цитата:

uerter:
можно ли что-то такое сделать как for each ну или чо-то в роде того в самом запросе
Можно. На серверных курсорах. Но, этого строго не рекомендуется делать, если можно обойтись запросами на уровне наборов данных, типа решения выше.


Часовой пояс GMT +4, время: 05:28.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.