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

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

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

Вы не зашли.

#1 10.02.2012 14:25:17

fans
Участник
Зарегистрирован: 10.02.2012
Сообщений: 5

упорядочивание выборки

Здравствуйте. Подскажите пожалуйста возможно ли упорядочить выборку из таблицы

id    name
1      a
2      a
3      a
4      b
5      c
6      b
7      b
8      a
9      c
10     b

в следующем порядке:

name:
a
b
c
a
b
c
a
b
a
b
c помощью одного запроса?
если возможно, то хотя примерно как это можно реализовать, заранее спасибо

Неактивен

 

#2 10.02.2012 20:07:18

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

Re: упорядочивание выборки

Если это для проекта, то делать нужно на клиенте.

Если это задача - препод задал, то см http://sqlinfo.ru/forum/viewtopic.php?id=1742
Читать тему до самого конца.


Ответ для вашего случая:

create table a(id int not null auto_increment primary key, q char(1));
insert into a (q) values('a'),('a'),('a'),('b'),('c'),('b'),('b'),('a'),('c'),('b');
select al.id,al.q from
(select * from a,(select @i:=0,@p:='')t order by q) al
where if(@p=q,@i:=@i+1,(@p:=q) or (@i:=1)) order by @i,q;

Неактивен

 

#3 10.02.2012 20:27:11

fans
Участник
Зарегистрирован: 10.02.2012
Сообщений: 5

Re: упорядочивание выборки

vasya написал:

Если это для проекта, то делать нужно на клиенте.

Если это задача - препод задал, то см http://sqlinfo.ru/forum/viewtopic.php?id=1742
Читать тему до самого конца.


Ответ для вашего случая:

create table a(id int not null auto_increment primary key, q char(1));
insert into a (q) values('a'),('a'),('a'),('b'),('c'),('b'),('b'),('a'),('c'),('b');
select al.id,al.q from
(select * from a,(select @i:=0,@p:='')t order by q) al
where if(@p=q,@i:=@i+1,(@p:=q) or (@i:=1)) order by @i,q;

Спасибо огромное!

Неактивен

 

#4 10.02.2012 23:46:49

fans
Участник
Зарегистрирован: 10.02.2012
Сообщений: 5

Re: упорядочивание выборки

немного изменил данные таблицы

create table a(id int not null auto_increment primary key, q int);
insert into a (q) values(11),(11),(11),(11),(22),(22),(22),(33),(33),(33),(33);

в этом случае выборка уже не работала

немного изменил код вместо (@p:=q) or (@i:=1) сделал  (@p:=q) and (@i:=1)
ведь в случае, когда q изменилось нужно обнулить значение счетчика И в переменную @p записать новое значение, то есть во втором примере значение счетчика не менялось? поэтому поставил AND и выборка заработала.
Но непонятно в чем разница м/у первым и вторым примером, почему в первом случае  (@p:=q) or (@i:=1) сработало, а во втором нет

Неактивен

 

#5 10.02.2012 23:49:51

fans
Участник
Зарегистрирован: 10.02.2012
Сообщений: 5

Re: упорядочивание выборки

а если в первом примере сделать (@p:=q) and (@i:=1), то не работает, а если (@p:=q) or (@i:=1) то опять работает))

Неактивен

 

#6 11.02.2012 11:32:10

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

Re: упорядочивание выборки

Сравните

select al.id,al.q,if(@p:=q,1,0) from
(select * from a,(select @i:=0,@p:='')t order by q) al;

для первого и второго случая.

Неактивен

 

#7 11.02.2012 19:30:01

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

Re: упорядочивание выборки

to fans,
рекомендую статью "Оптимизация запросов MySQL с использованием пользовательских переменных"

to all,
кто может объяснить такое поведение

mysql> set @p:='';
Query OK, 0 rows affected (0.00 sec)

mysql> select if(@p:='test',1,0);
+--------------------+
| if(@p:='test',1,0) |
+--------------------+
|                  0 |
+--------------------+
1 row in set (0.00 sec)

mysql> select if(@p:='2test',1,0);
+---------------------+
| if(@p:='2test',1,0) |
+---------------------+
|                   1 |
+---------------------+
1 row in set (0.00 sec)
 

Неактивен

 

#8 11.02.2012 21:01:38

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: упорядочивание выборки

Да, есть такой странный момент, что когда присваиваешь строку в переменную, то результат присваивания (то есть то, что возвращает operator=  ) непонятно что возвращает. Поэтому я в таких случаях предпочитал дописывать or 1, чтобы результат этого присваивания был положительный.

Отредактированно deadka (11.02.2012 21:02:35)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 12.02.2012 16:15:48

fans
Участник
Зарегистрирован: 10.02.2012
Сообщений: 5

Re: упорядочивание выборки

сравнил, во втором случае получается if(@p:=q,1,0) равно 1, то есть часть @p:=q уловия if(@p=q,@i:=@i+1,(@p:=q) or (@i:=1)) выполняется.вывел также значение индекса @i, то есть сделал: select al.id,al.q,@i,@p,if(@p:=q,1,0). ну и выяснилось, что значение индекса не сбрасывается:

i   q  @i
|1|11|0|11|1
|2|11|1|11|1
|3|11|2|11|1
|4|11|3|11|1
|7|22|3|22|1
|6|22|4|22|1
|5|22|5|22|1
|8|33|5|33|1
|9|33|6|33|1
|10|33|7|33|1
|11|33|8|33|1

но ведь мы присвоили начальное значение @p:=' '. и получается что сравнивая значение q=11 c @p='' это есть true. то есть дело в том что во втором случае тип "int"?

Неактивен

 

#10 12.02.2012 16:22:21

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

Re: упорядочивание выборки

См пост http://sqlinfo.ru/forum/viewtopic.php?pid=30288#p30288

В случае int будет true, а в случае строки true, если строка начинается с цифры. Т.е. это толи бага, толи фича.

И ещё нужно учитывать, что в следующей версии поведение может быть другим. Это в продолжение вопроса - почему на практике так делать не стоит.

Неактивен

 

#11 17.02.2012 04:56:51

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

Re: упорядочивание выборки

vasya написал:

См пост http://sqlinfo.ru/forum/viewtopic.php?pid=30288#p30288

В случае int будет true, а в случае строки true, если строка начинается с цифры. Т.е. это толи бага, толи фича.

И ещё нужно учитывать, что в следующей версии поведение может быть другим. Это в продолжение вопроса - почему на практике так делать не стоит.

Глупость сказал. Это задокументированное правило преобразования строки в число - http://dev.mysql.com/doc/refman/5.6/en/ … rsion.html


mysql> select 1<'6g';
+--------+
| 1<'6g' |
+--------+
|      1 |
+--------+
1 row in set, 1 warning (0.00 sec)

mysql> select 1<'g6';
+--------+
| 1<'g6' |
+--------+
|      0 |
+--------+
1 row in set, 1 warning (0.00 sec)

Неактивен

 

Board footer

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