![]() |
|
Задавайте вопросы, мы ответим
Вы не зашли.
С Мускуом знаком на уровне ламера, посему прошу помощи ![]()
есть некоторый рабочий запрос
SELECT
sorties.sessionid as sid,
sorties.missionid,
sorties.pilotid,
sorties.armyid,
IFNULL (sum(TIME_TO_SEC(timediff(sorties.endtime,sorties.starttime))), sum(TIME_TO_SEC(timediff(sessions.endtime,sorties.starttime)))) as AllSec,
TRUNCATE(IFNULL (sum(TIME_TO_SEC(timediff(sorties.endtime,sorties.starttime))), sum(TIME_TO_SEC(timediff(sessions.endtime,sorties.starttime))))/60,0) as MIN,
IFNULL (sum(TIME_TO_SEC(timediff(sorties.endtime,sorties.starttime))), sum(TIME_TO_SEC(timediff(sessions.endtime,sorties.starttime)))) -
TRUNCATE(IFNULL (sum(TIME_TO_SEC(timediff(sorties.endtime,sorties.starttime))), sum(TIME_TO_SEC(timediff(sessions.endtime,sorties.starttime))))/60,0)*60 as SEC
FROM sorties,sessions,mission
WHERE (sessionid=sessions.id) and (mission.id=sorties.missionid) and (WINNERID<>0)
GROUP BY
sorties.missionid,sorties.pilotid,sorties.armyid
AllSeс - вего секунд
Результат запроса:
sid missionid pilotid armyid AllSec MIN SEC
66 10 1 1 103 1 43
66 10 1 2 1486 24 46
64 10 6 1 1645 27 25
69 10 7 1 1506 25 6
68 10 9 2 1580 26 20
63 10 12 2 1558 25 58
60 10 16 2 1853 30 53
62 10 19 1 1302 21 42
вопросы:
- Некоторые строчки повторяются, как возможно избавиться от повторений? (Может быть для упрощения можно как-впихнуть переменные? только не знаю как...
)
Повторяющаяся строчка:
IFNULL (sum(TIME_TO_SEC(timediff(sorties.endtime,sorties.starttime))), sum(TIME_TO_SEC(timediff(sessions.endtime,sorties.starttime))))
- Как можно более красиво извлечь из AllSec3 время в МИН:СЕК (конечно желательно в один столбик, а не как у меня в 2)?
- Да и в принципе код получился оч грамосткий, какие возможны варианты оптимизации?
- еще один вопрос, но его позже... ![]()
Отредактированно AnpeJIb (29.08.2010 15:53:01)
Неактивен

AnpeJIb написал:
- Некоторые строчки повторяются, как возможно избавиться от повторений? (Может быть для упрощения можно как-впихнуть переменные? только не знаю как...
)
Посмотрите тему http://sqlinfo.ru/forum/viewtopic.php?id=1742
AnpeJIb написал:
- Как можно более красиво извлечь из AllSec3 время в МИН:СЕК (конечно желательно в один столбик, а не как у меня в 2)?
Лучше вообще этого не делать, а преобразовывать AllSec в нужный вам формат на клиенте.
Ну или функция concat() вам в помощь.
AnpeJIb написал:
- Да и в принципе код получился оч грамосткий, какие возможны варианты оптимизации?
Писать курсивом и/или мелким шрифтом ![]()
Неактивен
спс ![]()
ща будем сутками переваривать вашу полезную информацию... ![]()
а пока след вопрос:
хочу конструкцию SELECT записать как представление и в последствии работать с ним
CREATE OR REPLACE VIEW v AS
SELECT
sorties.sessionid,
sorties.missionid,
sorties.pilotid,
sorties.armyid,
IFNULL(sum(TIME_TO_SEC(timediff(sorties.endtime,sorties.starttime))), sum(TIME_TO_SEC(timediff(sessions.endtime,sorties.starttime)))) as AllSec
FROM sorties,sessions,mission
WHERE (sessionid=sessions.id) and (mission.id=sorties.missionid) and (WINNERID<>0)
GROUP BY
sorties.missionid,sorties.pilotid,sorties.armyid;
SELECT * FROM v
но не робит... ![]()
Ругается:
#1305 - FUNCTION il2sc.IFNULL does not exist
// il2sc. - наша БД
Версия MySQL-клиента: 5.0.45
И еще вопрос:
- пытаюсь достать максимальное число секунд
MAX(IFNULL(sum(TIME_TO_SEC(timediff(sorties.endtime,sorties.starttime))),
sum(TIME_TO_SEC(timediff(sessions.endtime,sorties.starttime))))) as AllSec
Кричит:
#1111 - Invalid use of group function
подозрения что я как-то не так использую IFNULL, что скажут профессионалы? ![]()
Отредактированно AnpeJIb (29.08.2010 19:17:46)
Неактивен

AnpeJIb написал:
спс
И еще вопрос:
- пытаюсь достать максимальное число секунд
MAX(IFNULL(sum(TIME_TO_SEC(timediff(sorties.endtime,sorties.starttime))),
sum(TIME_TO_SEC(timediff(sessions.endtime,sorties.starttime))))) as AllSec
Кричит:
#1111 - Invalid use of group function
подозрения что я как-то не так использую IFNULL, что скажут профессионалы?
ifnull здесь не при чем. Вы используете две группирующие функции max и sum.
У вас есть выборка, вы проводите группировку и считаете при этом сумму. А теперь хотите получить максимальные значения этих сумм, сгруппированных по какому-то полю, которое вы не указали.
Неактивен
А теперь хотите получить максимальные значения этих сумм, сгруппированных по какому-то полю, которое вы не указали.
и как указать? хочу сгруппировать по sorties.armyid, но в GROUP BY данное поле уже присутствует
Не понимаю немного... ![]()
Т.е. я хочу узнать: за какую из армий sorties.armyid пилот sorties.pilotid летал максимальное время MAX(...) as AllSec в каждой из миссий sorties.missionid
Т.е. из
sid missionid pilotid armyid AllSec MIN SEC
66 10 1 1 103 1 43
66 10 1 2 1486 24 46 - MAX
64 10 6 1 1645 27 25
я хочу получить
sid missionid pilotid armyid AllSec MIN SEC
66 10 1 2 1486 24 46
64 10 6 1 1645 27 25
И почему не робит представление?
хочу конструкцию SELECT записать как представление и в последствии работать с ним
CREATE OR REPLACE VIEW v AS
SELECT
sorties.sessionid,
sorties.missionid,
sorties.pilotid,
sorties.armyid,
IFNULL(sum(TIME_TO_SEC(timediff(sorties.endtime,sorties.starttime))), sum(TIME_TO_SEC(timediff(sessions.endtime,sorties.starttime)))) as AllSec
FROM sorties,sessions,mission
WHERE (sessionid=sessions.id) and (mission.id=sorties.missionid) and (WINNERID<>0)
GROUP BY
sorties.missionid,sorties.pilotid,sorties.armyid;
SELECT * FROM v
но не робит... sad
Ругается:
#1305 - FUNCTION il2sc.IFNULL does not exist
Если не вставлять представление то запрос выполняется без проблем, но мне нужно представление!
Ну или хотя бы понять почему оно не робит ![]()
Отредактированно AnpeJIb (30.08.2010 13:25:04)
Неактивен

AnpeJIb написал:
А теперь хотите получить максимальные значения этих сумм, сгруппированных по какому-то полю, которое вы не указали.
и как указать? хочу сгруппировать по sorties.armyid, но в GROUP BY данное поле уже присутствует
Не понимаю немного...
Т.е. я хочу узнать: за какую из армий sorties.armyid пилот sorties.pilotid летал максимальное время MAX(...) as AllSec в каждой из миссий sorties.missionid
Т.е. из
sid missionid pilotid armyid AllSec MIN SEC
66 10 1 1 103 1 43
66 10 1 2 1486 24 46 - MAX
64 10 6 1 1645 27 25
я хочу получить
sid missionid pilotid armyid AllSec MIN SEC
66 10 1 2 1486 24 46
64 10 6 1 1645 27 25
select ...,max(AllSec) from (ваш первый запрос) t group by armyid;
AnpeJIb написал:
И почему не робит представление?
хочу конструкцию SELECT записать как представление и в последствии работать с ним
но не робит... sad
Ругается:
#1305 - FUNCTION il2sc.IFNULL does not existЕсли не вставлять представление то запрос выполняется без проблем, но мне нужно представление!
Ну или хотя бы понять почему оно не робит
У меня в 5.1 ifnull в представлении работает. Видимо у вас ошибка из-за недоработки в старой версии. Рекомендую обновиться.
Неактивен
Огр спс! со всем разобрался ![]()
Обновился до 5.1 - представления работают бз проблем ![]()
Хочу поделится небольшим опытом по обновлению MySQL c 5.0 до 5.1 у TopServer 3.0.3 (может кому пригодится)
В папочке
C:\program files\TopServer 3.0.3\usr\local\mysql5\bin
заменяем файлик libmySQL.dll на аналогичный, но уже из дистрибутива MySQL 5.1
//манипуляции по замене dll-ки конечно же при предварительном отключении веб-сервера
ЗЫ: Отлично понимаю что ТопСервер по сравнению с Денвером не конфетка, особенно с учетом того что 1ый Бог знает как давно обновлялся.
Но в случае необходимости получения функционала Мускула версии 5.1, считаю лучше заменить одну Библиотеку нежели целый Веб-сервер.
Неактивен
Еще один вопрос
Существует некоторая таблица:
mission Win Gamer
10 -1 Elman
10 1 NosatiY
10 1 chumichka
10 -1 Stepa
10 -1 chizhik
10 -1 Silver
10 1 Sten
10 1 seed
10 1 Kelbos
10 1 Gy
10 -1 Pushok
13 1 Elman
13 1 NosatiY
13 1 chumichka
13 -1 mgdoctor
13 -1 Stepa
13 -1 PuzeN
13 -1 chizhik
13 -1 Silver
13 -1 Sten
13 1 seed
13 1 Kelbos
13 1 Gy
13 -1 ALF
14 1 Elman
14 1 NosatiY
14 1 chumichka
14 -1 mgdoctor
14 -1 Stepa
14 -1 PuzeN
.........................
В 2ух словах, в данной таблице отображается проиграл (Win= -1) или победил (Win= 1) игрок на определенной миссии игры.
Нам необходимо по каждому игроку получить следующее:
- сколько у него всего побед
- сколько у него всего поражений
- соотношение ПОБЕД / ПОРАЖЕНИЯ (делим)
Т.е. должно получится нечто вроде:
Gamer W L W/L
Elman 60 40 1.5
NosatiY 66 43 1.53
chumichka 40 18 2.22
...........................
как же можно все это красиво реализовать? ![]()
Отредактированно AnpeJIb (06.09.2010 20:35:08)
Неактивен

select gamer, sum(if(win=1,1,0)) as w, ... from tablename group by gamer;
Чтобы красиво рекомендую готический шрифт ![]()
Неактивен
чОрт! так же все на поверхности было
СПС! ![]()
Неактивен
имеется некоторый MySQL запрос (не совсем красивый, но не в этом суть
)
Отредактированно AnpeJIb (26.10.2010 16:28:41)
Неактивен
и еще один вопросик
в рнр коде видно что я его разбил на 2 кусочка, ибо если делать вместе (как видно в примере ниже) - не работает, ругается при этом аналогично: "Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource".
Вопрос - почему не работает?
Отредактированно AnpeJIb (26.10.2010 16:35:07)
Неактивен

Но в данном случае понятно, почему ![]()
mysql_query() позволяет выполнять только один запрос за раз, а Вы пытаетесь
выполнить несколько.
Неактивен