Задавайте вопросы, мы ответим
Вы не зашли.
С Мускуом знаком на уровне ламера, посему прошу помощи
есть некоторый рабочий запрос
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() позволяет выполнять только один запрос за раз, а Вы пытаетесь
выполнить несколько.
Неактивен