dúvida em select

Fórum sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dúvida em select

Mensagem por cjp »

Pessoal,

Tenho uma dúvida para executar um select numa tabela MySQL. Peço ajuda dos amigos.

O select atual está assim:

Código: Selecionar todos

SELECT * FROM tarefas WHERE (usuario='"+us+"' OR usuario='O' OR  usuario='B' usuario='S' OR usuario='F' OR usuario='M' OR usuario='K' OR usuario='X' OR usuario='N') AND prioridade>0 GROUP BY nrtarefa ORDER BY prioridade DESC,dtcarga

Este select retorna algo assim (de forma simplificada aqui para melhor compreensão):

Código: Selecionar todos

Usuário        nrtarefa              prioridade         dtcarga            tarefa
U                      U122                       9                       01/01/17           xxxxxxxxxxxxxxxxx
B                       B411                       9                       02/01/17           yyyyyyyyyyyyyyyyy
S                       S355                        9                       03/01/17          zzzzzzzzzzzzzzzzzzzz
O                      O222                       8                       01/01/17          wwwwwwwwwww
U                      U544                       8                       05/01/17          qqqqqqqqqqqqqqq
N                      N177                       7                       03/01/17           eeeeeeeeeeeeeee
U                      U611                       7                       05/01/17           ffffffffffffffffffffffff
...



Eu preciso que, quando us (variável no meu programa) for igual a “U”, o select faça uma das seguintes coisas (qualquer delas já resolveria meu problema, mas não estou conseguindo fazer nenhuma das duas):

1) Ordenar a busca pelo campo usuário também, depois do campo prioridade, mas de forma a que os usuários L, N, B e O ficassem por último dentro de cada grupo de prioridade; então, no exemplo acima, ficaria assim:

Código: Selecionar todos

Usuário        nrtarefa              prioridade         dtcarga            tarefa
U                      U122                       9                       01/01/17           xxxxxxxxxxxxxxxxx
S                       S355                        9                       03/01/17          zzzzzzzzzzzzzzzzzzzz
B                       B411                       9                       02/01/17           yyyyyyyyyyyyyyyyy
U                      U544                       8                       05/01/17          qqqqqqqqqqqqqqq
O                      O222                       8                       01/01/17          wwwwwwwwwww
U                      U611                       7                       05/01/17           ffffffffffffffffffffffff
N                      N177                       7                       03/01/17           eeeeeeeeeeeeeee
...

É fácil ver que não adianta colocar “usuário” no campo ORDER BY do select, pois não há uma ordem, nem crescente nem decrescente, a ser respeitada.


2) Diminuir a prioridade em 1 ponto para os usuários L, N, B e O apenas no select, ou apenas no ORDER BY. Daí o exemplo que postei ficaria assim:

Código: Selecionar todos

Usuário        nrtarefa              prioridade         dtcarga            tarefa
U                      U122                       9                       01/01/17           xxxxxxxxxxxxxxxxx
S                       S355                        9                       03/01/17          zzzzzzzzzzzzzzzzzzzz
B                       B411                       9 ou 8              02/01/17           yyyyyyyyyyyyyyyyy
U                      U544                       8                       05/01/17          qqqqqqqqqqqqqqq
O                      O222                       8 ou 7              01/01/17          wwwwwwwwwww
U                      U611                       7                       05/01/17           ffffffffffffffffffffffff
N                      N177                       7 ou 6              03/01/17           eeeeeeeeeeeeeee
...

Não faço ideia de como fazer isso.

Alguém poderia me ajudar?
Inacio de Carvalho Neto
Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

dúvida em select

Mensagem por NiltonGM »

Amigo, não compreendi exatamente o que você está querendo... enquanto isso, dá uma otimizada no seu select desse jeito:

Código: Selecionar todos

sql := "SELECT * FROM tarefas WHERE usuario IN ('" + us + "','O','B','S','F','M','K','X','N') AND prioridade>0 GROUP BY nrtarefa ORDER BY prioridade DESC,dtcarga" // [dtacarga DESC também?]
Nilton Medeiros
nilton@sistrom.com.br
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dúvida em select

Mensagem por cjp »

Obrigado, meu caro. Não conhecia esse operador IN. Sem dúvida fica mais claro.

Esclareço que dtcarga não seria decrescente, mas sim em ordem crescente.

O que eu queria seria ordenar diferentemente a consulta, de acordo com o usuário, mas não em ordem crescente nem decrescente, mas numa ordem aleatória que eu escolheria. Até pensei que esse operador IN faria isso, mas não faz.

Então, exemplificando, queria algo assim:

Código: Selecionar todos

sql := "SELECT * FROM tarefas WHERE usuario IN ('" + us + "','O','B','S','F','M','K','X','N') AND prioridade>0 GROUP BY nrtarefa ORDER BY prioridade DESC,usuario xx('" + us + "','O','B','S','F','M','K','X','N'),dtcarga"
Onde xx seria um operador semelhante ao IN que me permitisse escolher a ordem. Não sei se isso existe.

Me entende?
Inacio de Carvalho Neto
Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

dúvida em select

Mensagem por NiltonGM »

O que eu entendi o que vc está querendo não existe, até mesmo não faz sentido, por isso acho q continuo não entendendo.
O ORDER BY é para ordenar o conteúdo de uma ou mais colunas, talvez o que vc esteja querendo é um filtro pelo WHERE ou uma view da tabela juntando e filtrando determinadas colunas. Tenta expor a real finalidade desse seu ORDER BY condicionado e vamos aguardar alguém que consiga compreender melhor que eu pois eu sou ruimzinho pra entender pessoas.
:-o
Nilton Medeiros
nilton@sistrom.com.br
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dúvida em select

Mensagem por cjp »

Não é bem filtro que eu quero não, eu preciso apenas ordenar de uma forma diferente da que está ordenada.

Como assim não faz sentido o que eu quero?

Basicamente, tentando deixar bem claro, ao invés de ficar assim:

Código: Selecionar todos

U122
B411
S355
O222
U544
N177
U611
...
Ficaria assim:

Código: Selecionar todos

U122
S355
B411
U544
O222
U611
N177
...
Inacio de Carvalho Neto
Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

dúvida em select

Mensagem por NiltonGM »

hummm, você não pode usar o ORDER BY para por em DESORDEM, depois que pegar os dados do MySQL com o SELECT, você terá que jogar as informações em um ARRAY na "ordem" que você quer, pois o ORDER BY é como um índice, esse comando segue a regra de ordenar em ordem numérica e alfabética, seja ela crescente ou decrescente, fora isso, é no braço mesmo q vc vai ter que jogar no array, pois como pode o "B" estar entre o "U" e "S"?
Nilton Medeiros
nilton@sistrom.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

dúvida em select

Mensagem por JoséQuintas »

Isso deveria ser feito no programa e não no MySql, o programa fornecendo o order by.
Em todo caso, pode tentar montar algo parecido com isto

Código: Selecionar todos

SELECT 
* 
FROM tarefas 
WHERE usuario IN ('" + us + "','O','B','S','F','M','K','X','N') AND prioridade>0 
GROUP BY nrtarefa 
ORDER BY if( 1=1, campo1, if( 2=2, campo2, campo3 ) )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

dúvida em select

Mensagem por NiltonGM »

Pois é Zeh, ele também ele poderia criar uma coluna na tabela no BD MySQL, com o nome 'indice' do tipo INT ou TINYINT UNIQUE, e definir a ordem manualmente daquele registro, assim no SELECT ele poderia dar "ORDER BY indice", aí sim sairia na ordem exata que ele quer.
Nilton Medeiros
nilton@sistrom.com.br
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dúvida em select

Mensagem por cjp »

Concordo que estou querendo "colocar em desordem", pois a ordem que preciso não é realmente uma ordem comum, mas a ordem que me convém neste caso.

Quintas, desculpe, mas não entendi o teu exemplo: if(1=1... if(2=2...??? Não entendi também o campo1, campo2 etc.
Inacio de Carvalho Neto
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

dúvida em select

Mensagem por alxsts »

Olá!

SQL não é milagroso mas, creio que o que você quer fazer não seja tão difícil.

- Vemos que você monta a string do comando SQL em seu programa e a executa.
- Vemos também que você tem uma lista de códigos de usuário ('O','B','S','F','M','K','X','N').
- A esta lista você acrescenta o conteúdo da variável "us" do teu programa.
- Quais são os possíveis valores que esta variável pode assumir? Seriam "U" ou "" (vazio)?
- Como você executa seus comandos SQL?
- Usa ADO?
- Talvez o mais indicado fosse criar uma stored procedure no banco e, ao executá-la, passar como parâmetro o conteúdo da variável "us". Dentro da SP, seriam feitos os tratamentos necessários, dependendo do conteúdo do parâmetro.
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dúvida em select

Mensagem por cjp »

US pode ser F, K, M, S, U ou X.

Não uso ADO, uso RDDINFO.

O que seria uma stored procedure?
Inacio de Carvalho Neto
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

dúvida em select

Mensagem por alxsts »

Olá!
cjp escreveu:O que seria uma stored procedure?


Ainda tenho duvidas quanto ao problema:

- Se a variavel `us` pode conter F, K, M, S, U ou X e voce a concatena com '" + us + "','O','B','S','F','M','K','X','N' no WHERE, de onde vem o `L`?
- pergunto porque me baseio em tuas palavras:
1) Ordenar a busca pelo campo usuário também, depois do campo prioridade, mas de forma a que os usuários L, N, B e O ficassem por último dentro de cada grupo de prioridade; então, no exemplo acima, ficaria assim:
2) Diminuir a prioridade em 1 ponto para os usuários L, N, B e O apenas no select
Os valores `U` e `L` náo constam na lista do IN mas, qualquer um dos outros valores criaria duplicidade na lista do IN. Nao que va dar erro mas, seria desnecessario...
cjp escreveu: Eu preciso que, quando us (variável no meu programa) for igual a “U”, o select faça uma das seguintes coisas
- E quando for diferente de `U`?
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dúvida em select

Mensagem por cjp »

Vou assistir o vídeo pra aprender isso.

Mas adianto a resposta à tua questão: eu disse que a variável us é que pode ser F, K, M, S, U ou X. Mas na tabela o campo usuário também pode conter outros dados, incluindo N, L, B e O.

Se a variável us for diferente de U, também precisarei fazer algo assim, com algumas diferenças. Mas, se eu aprender a fazer com o U, poderei fazer para todos os demais.
Inacio de Carvalho Neto
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

dúvida em select

Mensagem por alxsts »

cjp escreveu:Mas na tabela o campo usuário também pode conter outros dados, incluindo N, L, B e O.
Mas do jeito que está o WHERE, nunca vai retornar um `L`,visto que `us` nunca contem `L`e o mesmo ocorre com a lista IN...

Código: Selecionar todos

sql := "SELECT * FROM tarefas WHERE usuario IN ('" + us + "','O','B','S','F','M','K','X','N') AND prioridade>0 GROUP BY nrtarefa ORDER BY prioridade DESC,usuario xx('" + us + "','O','B','S','F','M','K','X','N'),dtcarga"
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dúvida em select

Mensagem por cjp »

Realmente eu esqueci do L no exemplo que eu dei acima. Mas no meu programa está o L. Então, corrigindo, seria:

Código: Selecionar todos

sql := "SELECT * FROM tarefas WHERE usuario IN ('" + us + "','O','B','S','F','M','K','X','N','L') AND prioridade>0 GROUP BY nrtarefa ORDER BY prioridade DESC,usuario xx('" + us + "','O','B','S','F','M','K','X','N','L'),dtcarga"
Inacio de Carvalho Neto
Responder