Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте. Подскажите пожалуйста возможно ли упорядочить выборку из таблицы
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 помощью одного запроса?
если возможно, то хотя примерно как это можно реализовать, заранее спасибо
Неактивен
Если это для проекта, то делать нужно на клиенте.
Если это задача - препод задал, то см http://sqlinfo.ru/forum/viewtopic.php?id=1742
Читать тему до самого конца.
Ответ для вашего случая:
Неактивен
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;
Спасибо огромное!
Неактивен
немного изменил данные таблицы
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) сработало, а во втором нет
Неактивен
а если в первом примере сделать (@p:=q) and (@i:=1), то не работает, а если (@p:=q) or (@i:=1) то опять работает))
Неактивен
Сравните
Неактивен
to fans,
рекомендую статью "Оптимизация запросов MySQL с использованием пользовательских переменных"
to all,
кто может объяснить такое поведение
Неактивен
Да, есть такой странный момент, что когда присваиваешь строку в переменную, то результат присваивания (то есть то, что возвращает operator= ) непонятно что возвращает. Поэтому я в таких случаях предпочитал дописывать or 1, чтобы результат этого присваивания был положительный.
Отредактированно deadka (11.02.2012 21:02:35)
Неактивен
сравнил, во втором случае получается 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"?
Неактивен
См пост http://sqlinfo.ru/forum/viewtopic.php?pid=30288#p30288
В случае int будет true, а в случае строки true, если строка начинается с цифры. Т.е. это толи бага, толи фича.
И ещё нужно учитывать, что в следующей версии поведение может быть другим. Это в продолжение вопроса - почему на практике так делать не стоит.
Неактивен
vasya написал:
См пост http://sqlinfo.ru/forum/viewtopic.php?pid=30288#p30288
В случае int будет true, а в случае строки true, если строка начинается с цифры. Т.е. это толи бага, толи фича.
И ещё нужно учитывать, что в следующей версии поведение может быть другим. Это в продолжение вопроса - почему на практике так делать не стоит.
Глупость сказал. Это задокументированное правило преобразования строки в число - http://dev.mysql.com/doc/refman/5.6/en/ … rsion.html
Неактивен