Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Marcos Vinícius

Ordem alfabetica campo com letras e numeros

Recommended Posts

Olá,

 

Alguém sabe como deixar em ordem alfabética um campo VARCHAR que tem letras e números?

 

Só para constar (para os moderadores)... eu já postei questão semelhante na área mysql mas não consegui resolver. Como parece que não dá por mysql, estou postando aqui em php pra ver se tem algum jeito com alguma função.

 

O problema é o seguinte... a consulta que faço tem que listar os dados em ordem alfabética. Mas o retorno da consulta tá sendo assim:

 

 

campo - 1

campo - 10

campo - 11

campo - 12

...

campo - 2

campo - 20

 

 

No lugar de

 

campo - 1

campo - 2

campo - 3

 

Eu já tentei acrescentar mais um campo só pra fazer a ordenação e numerá-lo separadamente, mas não resolveu.

 

A questão é que são vários cadastros diferentes... por exemplo:

 

liquidados - 1

ativos - 1

 

Então, não dá pra fazer um campo 1,2,3,4,5...

Cada texto tem que ter um sequencial destes separado. Eu até coloquei. Ficou assim:

 

nome ------------- ordem

liquidados - 1 ----- 1

liquidados - 2 ----- 2

liquidados - 3 ----- 3

liquidados - 4 ----- 4

 

ativos - 1 --------- 1

ativos - 2 --------- 2

ativos - 3 --------- 3

ativos - 4 --------- 4

 

Pedi para o mysql ordenar primeiro pelo "nome" e depois por "ordem"

 

SELECT * FROM localiza order by nome, ordem

 

mas continua o problema. Quando chega em 10, esse vem logo depois do 1 e não do 9.

 

Alguém tem alguma idéia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim que isso pode resolver seu problema

(SELECT id,(campo) as numero FROM sua_tabela WHERE campo REGEXP "^[0-9][~]*"  ORDER BY abs(campo) ASC)
 UNION (SELECT id,(campo) as letras FROM sua_tabela WHERE campo REGEXP "^[a-z][~]*" ORDER BY letras ASC) 

 

primeiro ele faz uma consultas dos campos que começem com numeros usando expressão regular e a função ABS() ele vai tratar os dados como int para para ordenar uso union para unir as duas consultas em uma só tabela depois pegos e faço uma segunda consulta dos campos que comecem com letras e ordeno eles de forma crescente.

 

Espero que nao tenha ficado muito confuso minha explicação kkk

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em ordem ascendente, um truque um tanto quanto curioso, mas que funciona na maioria das vezes, é ordenar, primeiramente, pelo tamanho do campo

select campo from tabela order by LENGTH(campo) ASC, campo ASC

Compartilhar este post


Link para o post
Compartilhar em outros sites

Evandro,

 

Essa tua dica quase deu...rs.. ela ordenou alguns registros mas outros ficaram com registros no meio. De qualquer forma, ordenou bem melhor e não tá mais ficando o 10 depois do 1.

 

Ricardo,

 

Power essa dica...rs... Alguma coisa não deu certo... olha o erro:

 

Parse error: syntax error, unexpected '[' in /srv/disk2/1270874/www/controleproc.cacpar.com/listar_localiza.php on line 18

 

A consulta tá assim:

 

mysql_query("SELECT id_localiza,(nome) as numero FROM localiza WHERE nome REGEXP "^[0-9][~]*" ORDER BY abs(nome) ASC)

UNION (SELECT id_localiza,(nome) as letras FROM localiza WHERE nome REGEXP "^[a-z][~]*" ORDER BY letras ASC");

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro é o seguinte tinha aspas duplas dentro de aspas duplas.

 

tente assim:

mysql_query("SELECT id_localiza,(nome) as numero FROM localiza WHERE nome REGEXP '^[0-9][~]*' ORDER BY abs(nome) ASC)
UNION (SELECT id_localiza,(nome) as letras FROM localiza WHERE nome REGEXP '^[a-z][~]*' ORDER BY letras ASC"); 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ricardo,Não deu... agora não tá conseguindo buscar nada.

 

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in

 

Coloquei o código no phpMyAdmin e também deu erro. Aí coloquei só a primeira linha

 

SELECT id_localiza,(nome) as numero FROM localiza WHERE nome REGEXP '^[0-9][~]*' ORDER BY abs(nome) ASC

 

Retornou a busca mas não achou nada...

 

"MySQL retornou um conjunto vazio (ex. zero registros). "

Compartilhar este post


Link para o post
Compartilhar em outros sites

posta ai a estrutua do seu banco de dados

 

 

CREATE TABLE `foo` (  `id` int(2) NOT NULL AUTO_INCREMENT,  `field` char(15) NOT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;INSERT INTO `foo` VALUES ('1', 'A - 1');INSERT INTO `foo` VALUES ('2', 'A - 2');INSERT INTO `foo` VALUES ('3', 'A - 3');INSERT INTO `foo` VALUES ('4', 'A - 40');INSERT INTO `foo` VALUES ('5', 'C - 5');INSERT INTO `foo` VALUES ('6', 'B - 2');INSERT INTO `foo` VALUES ('7', 'B - 7');INSERT INTO `foo` VALUES ('8', 'A - 10');INSERT INTO `foo` VALUES ('9', 'A - 20');INSERT INTO `foo` VALUES ('10', 'A - 31');SELECT id ,field ,SUBSTR(field, 1, LOCATE('-',field)-2) AS var ,SUBSTR(field, LOCATE('-',field)+2, LENGTH(field)) AS number #,LOCATE('-',field) AS _posFROM fooORDER BY var, CAST( number AS UNSIGNED ) ASC;

 

LOCATE

http://www.hachi-log.com/mysql-locate/

 

 

CAST( number AS UNSIGNED )

http://stackoverflow.com/questions/12126991/cast-from-varchar-to-int-mysql

 

 

MySQL documentation

http://dev.mysql.com/doc/refman/5.5/en/string-functions.html

http://dev.mysql.com/doc/refman/5.5/en/cast-functions.html#function_cast

Compartilhar este post


Link para o post
Compartilhar em outros sites

Show de bola!!! Funcionou legal!!! Não colocou em ordem o que não tem o hifen mas isso não é importante pois são poucos e ficaram no início da tabela. O que estava pegando eram os que tinham hífen.Valeu pessoal. Obrigado Ricardo e hinom pela ajuda e hinom... Impressionante a solução!!! Grande abraço!!!

 

Opa.... Consegui colocar tudo em ordem alfabética... até os que não tinham hífen...SELECT id_localiza ,nome ,SUBSTR(nome, 1, LOCATE('-',nome)-2) AS var ,SUBSTR(nome, LOCATE('-',nome)+2, LENGTH(nome)) AS number #,LOCATE('-',nome) AS _posFROM localiza ORDER BY var, CAST( number AS UNSIGNED ), nome ASC

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hinom,

 

Não consegui entender como funciona essa função mysql. Olhei no manual do mysql mas tá muito simples lá.

 

O que eu preciso é fazer a mesma coisa com um campo que armazena datas, mas no formato texto. Tipo 00/00/0000. OK... vocês vão dizer que eu tenho que mudar o campo para "data" no lugar do "texto". O problema é que onde eu uso esse sistema, tem dois tipos de browser. Um antigo e outro mais atual. Se eu colocar "data", algumas coisas funcionam em um mas não no outro.

 

 

,SUBSTR(field, 1, LOCATE('-',field)-2) AS var ,SUBSTR(field, LOCATE('-',field)+2, LENGTH(field)) AS number #,LOCATE('-',field) AS _pos FROM foo ORDER BY var, CAST( number AS UNSIGNED ) ASC;
Minhas deduções:
,SUBSTR(field, 1, LOCATE('-',field)-2) AS var >> isso quer dizer pra separar, do campo, o que tem antes do '-' e colocá-lo como 'var'? O que é o -2

 

 

 

SUBSTR(field, LOCATE('-',field)+2 >> Imagino que foi pra pegar o que tem depois do "-'. E o +2?

 

LENGTH(field)) AS number # >> Acho que foi pra transformar o resultado do segundo LOCATE como number

 

LOCATE('-',field) AS _pos >> Essa não imagino o que pode ser

 

ORDER BY var >> Essa pegou também porque eu imaginava que a ordem seria por number e que var seria o texto que pegou antes do número

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que onde eu uso esse sistema, tem dois tipos de browser. Um antigo e outro mais atual. Se eu colocar "data", algumas coisas funcionam em um mas não no outro.

Meu querido, o navegador não sabe nem se você está utilizando banco de dados, quem dirá qual o tipo do campo. Viagem isso aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é isso Evandro!!! Eu tô falando do form. Se eu uso campo data no google chrome, o browser coloca um calendário para o usuário e nos IE antigos não (que infelizmente ainda tem onde trabalho). Nem liam campos tipo "data". Então, coloquei uma máscara de data. Se o usuário usar o IE, a máscara funciona. Se usar o Chrome e quiser digitar no lugar de usar o calendário, a máscara não funciona. Então, depende do browser que o cara usa, o formato gravado no bd vai ser diferente. Por isso, escolhi tipo "texto".



Tive outra idéia!!! Mais simples...

Compartilhar este post


Link para o post
Compartilhar em outros sites

sobre a questão de browser e o "issue" com a data... mesmo com essa explicação no post #12, continua a mesma explicação do post #11..

 

vc deve tratar o campo data como data e não como char.. não importa o meio de como é inserido.. crie um padrão para inserção, faça filtragens de consistência, valide o formato e a data antes de gravar no banco de dados

 

 

o post #10, li superficialmente..

 

 

 

 

Minhas deduções:
,SUBSTR(field, 1, LOCATE('-',field)-2) AS var >> isso quer dizer pra separar, do campo, o que tem antes do '-' e colocá-lo como 'var'? O que é o -2

 

Modifique o 2 para 3 e veja o resultado.

Modifique para 4 ou para 1 e veja o resultado novamente.

 

Com base nessa observação vc entenderá.

 

 

 

Está fazendo uma confusão enorme por causa dos ALIAS.

O "ALIAS", traduzindo para português, é "apelido" ou "atalho".. enfim, pseudônimo, nome mascarado..

 

Exemplo no MySQL,

SELECT 
    person_name AS nome
    ,person_surname AS sobrenome
FROM
    person AS pessoas

 

 

Os ALIAS que usei no exemplo :

 

AS var

AS number...

 

não são CASTINGS.. são apenas ALIAS..

 

 

Há outros pontos para responder mas não disponho de tempo..

Desculpe se ficou meio vago as respostas. Mas qualquer coisa pergunte aí,.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é isso Evandro!!! Eu tô falando do form. Se eu uso campo data no google chrome, o browser coloca um calendário para o usuário e nos IE antigos não (que infelizmente ainda tem onde trabalho). Nem liam campos tipo "data". Então, coloquei uma máscara de data. Se o usuário usar o IE, a máscara funciona. Se usar o Chrome e quiser digitar no lugar de usar o calendário, a máscara não funciona. Então, depende do browser que o cara usa, o formato gravado no bd vai ser diferente. Por isso, escolhi tipo "texto".

sobre a questão de browser e o "issue" com a data... mesmo com essa explicação no post #12, continua a mesma explicação do post #11..

Mesmo que você use [inline]<input type="number">[/inline], pro PHP vai chegar como texto. Isso é apenas um novo facilitador pra validação e pra exibir componentes corretamente no mobile.

 

http://modernizr.com

http://jqueryui.com/datepicker

if (!Modernizr.inputtypes.date) {
    $('[type=date]').datepicker();
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.