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

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

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

Вы не зашли.

#1 10.12.2013 09:35:13

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Тип вычисляемого поля

select
field1 / field2 as Number1
field2 / field4 as Number2

Number1 дает 1
Number2 дает 1,3333333

Как-то можно задать тип, чтобы было 1,00 и 1,33?

спасибо

Неактивен

 

#2 10.12.2013 09:38:51

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Тип вычисляемого поля

В каком контексте осуществляется печать? Кажется, что это способ вывода в скрипте. Если PHP, используйте printf

Неактивен

 

#3 10.12.2013 10:13:32

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Тип вычисляемого поля

Нет, в ПХП я вообще без проблем данные в нужный вид приведу. ПРосто хотел максимум калькуляций сделать в скуле. Если это проблематично - то в пхп сделаю, там это элементарно.

Смысл такой, что конечные данные выводятся в таблицу и для глаза восприятие гораздо лучше, когда числа одинаково выглядят, а не так, что одно из одного знака, а одно из 10. Ну и там таких строк 30 штук, всё в разнобой получается.

Отредактированно Bust_Ed (10.12.2013 10:15:38)

Неактивен

 

#4 10.12.2013 10:19:24

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Тип вычисляемого поля

Подозреваю, что MySQL возвращает число в виде float, но вы его печатате средствами php и эти средства округляют до целого.

Неактивен

 

#5 10.12.2013 10:28:16

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Тип вычисляемого поля

Да нет, это сам MySQL выводит. Через myadmin пока запрос составляю, до пхп дело не дошло. smile ПОле вычисляемое, по умолчанию какой тип имеет? Как-то сменить тип можно?

Неактивен

 

#6 10.12.2013 10:37:15

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Тип вычисляемого поля

Какая версия MySQL, какой именно запрос? Не воспроизводится:

CREATE TABLE a (a int, b int);
INSERT INTO a VALUES (1,2),(3,4);
mysql> SELECT a/b FROM a;
+--------+
| a/b    |
+--------+
| 0.5000 |
| 0.7500 |
+--------+


Проверил то же в phpmyadmin - аналогичный результат.

Неактивен

 

#7 10.12.2013 10:40:21

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Тип вычисляемого поля

Попробуйте явно задать формат

SELECT FORMAT(field1 / field2, 5) as Number1;

Неактивен

 

#8 10.12.2013 12:02:53

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Тип вычисляемого поля

Спасибо, как раз то, что я искал, только 5 поменял на 2, осталось два знака после запятой, полностью устраивает такое решение.

Неактивен

 

#9 11.12.2013 11:34:12

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Тип вычисляемого поля

SELECT FORMAT(a/b,2) as F FROM a
Order by F desc

не сортирует. sad

Вот так получается:

F
72.00
7.00
61.00
6.00
6.00
50.00

Т.е. сортирует, но как стринг, похоже... как int можно отсортировать?

Неактивен

 

#10 11.12.2013 11:51:31

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Тип вычисляемого поля

Сортирует, но по строке. Нужно сортировать по самому значению

SELECT FORMAT(a/b,2) as F FROM a Order by a/b desc

Неактивен

 

#11 11.12.2013 12:34:01

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Тип вычисляемого поля

Если order by F, то в реальной таблице вывод такой:

90
9
9
8
75
60
6
6
6
5
5
...

Если по формуле, которая считает F (Order BY IF(SUM(allgames.Team2SetPoints)=0, FORMAT(SUM(allgames.Team1SetPoints) * 100 / (SELECT COUNT(Distinct team2) from `match` where `match`.tournament_id = allgames.tournament_id), 2),  FORMAT( SUM(allgames.Team1SetPoints) / SUM(allgames.Team2SetPoints), 2)) DESC)

вывод такой:

9
9
112,5
90
8
6
6
6
60
75
5
5
4,5
4,5
4,5
4,33
4
3,67
3,6
3
3
3
3
42,86

И если в первом случае видна сортировка по стринг, то во втором случае я логики вообще не вижу. sad Т.е., конечно, он "немножко" сортирует. Но все равно не очень ясно как и, главное, не так, как надо.

Если надо - могу дать все значения исходных (а,b).

Неактивен

 

#12 11.12.2013 12:43:51

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Тип вычисляемого поля

У вас очень сложное выражение с подзапросами - лучше его поместить в область SELECT:

SELECT a/b F0, FORMAT(a/b,2) as F FROM a Order by F0 DESC;

Можно форматирование вынести во внешний запрос
SELECT FORMAT(F,2) FROM ( SELECT a/b F FROM a Order by F DESC ) as T1;

Неактивен

 

#13 11.12.2013 12:47:18

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Тип вычисляемого поля

Сейчас попробую.

С ходу вопрос:

SELECT a/b F0, FORMAT(a/b,2) as F FROM a Order by F0 DESC;

Я пишу SELECT a/b AS F0, вы AS опускаете. Мне с AS более читабельно, хотел понять в чем-то существенная разница есть?

Неактивен

 

#14 11.12.2013 12:53:39

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Тип вычисляемого поля

AS можно опускать, разницы нет. Это достаточно общепринятая практика заменять AS на пробел

Неактивен

 

#15 11.12.2013 13:40:25

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Тип вычисляемого поля

Спасибо.

В самом селекте ничего не менял, просто в сортировке убрал форматирование, все встало на свои места.

Неактивен

 

#16 15.12.2013 23:26:11

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Тип вычисляемого поля

Ну, кажется, окончательно встрял.

Идея такая, что теперь результат запроса (где есть формат и есть сортировка и все правильно) сохраняется в темп таблицу.

И вот если в этой темп таблице сортировать:

8,00
48,00
42,00
38,18
2,10

Вот такая сортировка получается...

Неактивен

 

#17 16.12.2013 00:21:12

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Тип вычисляемого поля

Вы заносите во временную таблицу отформатированные числа, но лучше их сохранять числами до последнего этапа, а потом уже форматировать. В вашем случае, во временной таблице они являются строками varchar. Можно преобразовать в число с помощью ORDER BY x+0.0, но при этом не будет использоваться индекс по этому полю.

mysql> create table rt (a varchar(100));
mysql> insert into rt values ('8,00', '48,00', '42,00', '38,18', '2,10');
mysql> SELECT * FROM rt ORDER BY a DESC;
+-------+
| a     |
+-------+
| 8,00  |
| 48,00 |
| 42,00 |
| 38,18 |
| 2,10  |
+-------+
mysql> SELECT * FROM rt ORDER BY a+0.0 DESC;
+-------+
| a     |
+-------+
| 48,00 |
| 42,00 |
| 38,18 |
| 8,00  |
| 2,10  |
+-------+
 

Неактивен

 

#18 16.12.2013 08:20:40

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Тип вычисляемого поля

Точно. Нужно убрать все форматирование, которое сделано до временной таблицы. Оно мне там не нужно. Тогда и сортировка красивше выглядеть будет. Но ваше решение весьма элегантное, учитывая, что ничего менять не нужно. smile

Пока временно сделаю так, а чуть позже уберу форматирование отовсюду, оставлю уже в самом финале его.

Индекс не очень нужен, там 200 строк во временной таблице, не думаю, что он прям сильно повлияет на производительность.

Отредактированно Bust_Ed (16.12.2013 08:21:43)

Неактивен

 

Board footer

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