SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 29.08.2010 15:47:08

AnpeJIb
Участник
Зарегистрирован: 29.08.2010
Сообщений: 8

хочу чтобы красиво! :)

С Мускуом знаком на уровне ламера, посему прошу помощи smile

есть некоторый рабочий запрос

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

вопросы:
- Некоторые строчки повторяются, как возможно избавиться от повторений? (Может быть для упрощения можно как-впихнуть переменные? только не знаю как... smile)
   Повторяющаяся строчка:
   IFNULL (sum(TIME_TO_SEC(timediff(sorties.endtime,sorties.starttime))), sum(TIME_TO_SEC(timediff(sessions.endtime,sorties.starttime))))
- Как можно более красиво извлечь из AllSec3 время в МИН:СЕК (конечно желательно в один столбик, а не как у меня в 2)?
- Да и в принципе код получился оч грамосткий, какие возможны варианты оптимизации?
- еще один вопрос, но его позже... smile

Отредактированно AnpeJIb (29.08.2010 15:53:01)

Неактивен

 

#2 29.08.2010 17:49:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: хочу чтобы красиво! :)

AnpeJIb написал:

- Некоторые строчки повторяются, как возможно избавиться от повторений? (Может быть для упрощения можно как-впихнуть переменные? только не знаю как... smile)

Посмотрите тему http://sqlinfo.ru/forum/viewtopic.php?id=1742

AnpeJIb написал:

- Как можно более красиво извлечь из AllSec3 время в МИН:СЕК (конечно желательно в один столбик, а не как у меня в 2)?

Лучше вообще этого не делать, а преобразовывать AllSec  в нужный вам формат на клиенте.
Ну или функция concat() вам в помощь.

AnpeJIb написал:

- Да и в принципе код получился оч грамосткий, какие возможны варианты оптимизации?

Писать курсивом и/или мелким шрифтом wink

Неактивен

 

#3 29.08.2010 19:16:37

AnpeJIb
Участник
Зарегистрирован: 29.08.2010
Сообщений: 8

Re: хочу чтобы красиво! :)

спс smile
ща будем сутками переваривать вашу полезную информацию... smile
а пока след вопрос:

хочу конструкцию 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
// 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, что скажут профессионалы? smile

Отредактированно AnpeJIb (29.08.2010 19:17:46)

Неактивен

 

#4 29.08.2010 19:51:06

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: хочу чтобы красиво! :)

AnpeJIb написал:

спс smileИ еще вопрос:
- пытаюсь достать максимальное число секунд
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, что скажут профессионалы? smile

ifnull здесь не при чем. Вы используете две группирующие функции max и sum.
У вас есть выборка, вы проводите группировку и считаете при этом сумму. А теперь хотите получить максимальные значения этих сумм, сгруппированных по какому-то полю, которое вы не указали.

Неактивен

 

#5 30.08.2010 13:07:25

AnpeJIb
Участник
Зарегистрирован: 29.08.2010
Сообщений: 8

Re: хочу чтобы красиво! :)

А теперь хотите получить максимальные значения этих сумм, сгруппированных по какому-то полю, которое вы не указали.

и как указать? хочу сгруппировать по sorties.armyid, но в GROUP BY данное поле уже присутствует
Не понимаю немного... roll
Т.е. я хочу узнать: за какую из армий 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

Если не вставлять представление то запрос выполняется без проблем, но мне нужно представление! smile Ну или хотя бы понять почему оно не робит sad

Отредактированно AnpeJIb (30.08.2010 13:25:04)

Неактивен

 

#6 30.08.2010 13:32:54

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: хочу чтобы красиво! :)

AnpeJIb написал:

А теперь хотите получить максимальные значения этих сумм, сгруппированных по какому-то полю, которое вы не указали.

и как указать? хочу сгруппировать по sorties.armyid, но в GROUP BY данное поле уже присутствует
Не понимаю немного... roll
Т.е. я хочу узнать: за какую из армий 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

Если не вставлять представление то запрос выполняется без проблем, но мне нужно представление! smile Ну или хотя бы понять почему оно не робит sad

У меня в 5.1 ifnull в представлении работает. Видимо у вас ошибка из-за недоработки в старой версии. Рекомендую обновиться.

Неактивен

 

#7 04.09.2010 17:31:43

AnpeJIb
Участник
Зарегистрирован: 29.08.2010
Сообщений: 8

Re: хочу чтобы красиво! :)

Огр спс! со всем разобрался smile
Обновился до 5.1 - представления работают бз проблем smile

Хочу поделится небольшим опытом по обновлению 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, считаю лучше заменить одну Библиотеку нежели целый Веб-сервер.

Неактивен

 

#8 06.09.2010 20:31:30

AnpeJIb
Участник
Зарегистрирован: 29.08.2010
Сообщений: 8

Re: хочу чтобы красиво! :)

Еще один вопрос

Существует некоторая таблица:

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
...........................

как же можно все это красиво реализовать? smile

Отредактированно AnpeJIb (06.09.2010 20:35:08)

Неактивен

 

#9 06.09.2010 20:54:13

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: хочу чтобы красиво! :)

select gamer, sum(if(win=1,1,0)) as w, ... from tablename group by gamer;

Чтобы красиво рекомендую готический шрифт smile

Неактивен

 

#10 06.09.2010 21:16:37

AnpeJIb
Участник
Зарегистрирован: 29.08.2010
Сообщений: 8

Re: хочу чтобы красиво! :)

чОрт! так же все на поверхности было smile СПС! smile

Неактивен

 

#11 26.10.2010 16:24:26

AnpeJIb
Участник
Зарегистрирован: 29.08.2010
Сообщений: 8

Re: хочу чтобы красиво! :)

имеется некоторый MySQL запрос (не совсем красивый, но не в этом суть smile )

CREATE OR REPLACE VIEW P1 AS
SELECT
sorties.sessionid,
sorties.missionid,
if (winnerid=2 or winnerid=-1, 2, 1) as WinnerArmyId,
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;

CREATE OR REPLACE VIEW P2 AS
SELECT missionid, MAX(AllSec) as MaxAllSec FROM P1
GROUP BY missionid;

CREATE OR REPLACE VIEW P3 AS
SELECT P1.missionid,pilotid,armyid,WinnerArmyId,AllSec,MaxAllSec,
if (AllSec*2>=MaxAllSec,if (armyid=WinnerArmyId,1,-1),0) as Win
FROM P1,P2
WHERE P1.missionid=P2.missionid;

SELECT callsign,
sum(if(win=1,1,0)) as W,
sum(if(win=-1,1,0)) as L,
sum(if(win=1,1,0))/(sum(if(win=-1,1,0))+1) as WL
FROM P3,pilots
WHERE P3.pilotid=pilots.id
GROUP BY callsign
ORDER BY W DESC, L, WL DESC


Т.е. мы создаем три представления (P1,P2,P3), и работаем с ними.

Все это отлично работает чз phpMyAdmin

А когда пытаюсь выполнить практически тоже самое чз php - не получается

<?
mysql_query("
CREATE OR REPLACE VIEW P1 AS
SELECT
sorties.sessionid,
sorties.missionid,
if (winnerid=2 or winnerid=-1, 2, 1) as WinnerArmyId,
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;

CREATE OR REPLACE VIEW P2 AS
SELECT missionid, MAX(AllSec) as MaxAllSec FROM P1
GROUP BY missionid;

CREATE OR REPLACE VIEW P3 AS
SELECT P1.missionid,pilotid,armyid,WinnerArmyId,AllSec,MaxAllSec,
if (AllSec*2>=MaxAllSec,if (armyid=WinnerArmyId,1,-1),0) as Win
FROM P1,P2
WHERE P1.missionid=P2.missionid
"
,$connect);

$sql_top_winners = mysql_query("
SELECT callsign,
sum(if(win=1,1,0)) as W,
sum(if(win=-1,1,0)) as L,
sum(if(win=1,1,0))/(sum(if(win=-1,1,0))+1) as WL
FROM P3,pilots
WHERE P3.pilotid=pilots.id
GROUP BY callsign
ORDER BY W DESC, L, WL DESC
"
,$connect);
$top_winners=mysql_fetch_array($sql_top_winners);
?>


Ругается "Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource"

И вижу что представления (P1,P2,P3) просто не создаются.

Сначала подумал что существует разница в привилегиях у пользователей которых использую чз рнр скрипт и чз рнрМуАдмин, но нет, привилегии идентичны - ALL PRIVILEGES

Подскажите плз, почему такое происходит?

Отредактированно AnpeJIb (26.10.2010 16:28:41)

Неактивен

 

#12 26.10.2010 16:32:57

AnpeJIb
Участник
Зарегистрирован: 29.08.2010
Сообщений: 8

Re: хочу чтобы красиво! :)

и еще один вопросик

в рнр коде видно что я его разбил на 2 кусочка, ибо если делать вместе (как видно в примере ниже) - не работает, ругается при этом аналогично: "Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource".
Вопрос - почему не работает? smile

<?
$sql_top_winners = mysql_query("
CREATE OR REPLACE VIEW P1 AS
SELECT
sorties.sessionid,
sorties.missionid,
if (winnerid=2 or winnerid=-1, 2, 1) as WinnerArmyId,
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;

CREATE OR REPLACE VIEW P2 AS
SELECT missionid, MAX(AllSec) as MaxAllSec FROM P1
GROUP BY missionid;

CREATE OR REPLACE VIEW P3 AS
SELECT P1.missionid,pilotid,armyid,WinnerArmyId,AllSec,MaxAllSec,
if (AllSec*2>=MaxAllSec,if (armyid=WinnerArmyId,1,-1),0) as Win
FROM P1,P2
WHERE P1.missionid=P2.missionid;

SELECT callsign,
sum(if(win=1,1,0)) as W,
sum(if(win=-1,1,0)) as L,
sum(if(win=1,1,0))/(sum(if(win=-1,1,0))+1) as WL
FROM P3,pilots
WHERE P3.pilotid=pilots.id
GROUP BY callsign
ORDER BY W DESC, L, WL DESC
"
,$connect);
$top_winners=mysql_fetch_array($sql_top_winners);
?>

Отредактированно AnpeJIb (26.10.2010 16:35:07)

Неактивен

 

#13 26.10.2010 16:55:40

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: хочу чтобы красиво! :)

FAQ №2

Неактивен

 

#14 26.10.2010 17:00:05

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: хочу чтобы красиво! :)

Но в данном случае понятно, почему wink

mysql_query() позволяет выполнять только один запрос за раз, а Вы пытаетесь
выполнить несколько.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson