Clipper On Line • Ver Tópico - dúvida em select

dúvida em select

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

dúvida em select

Mensagempor cjp » 24 Jan 2017 13:47

Pessoal,

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

O select atual está assim:

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):

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:

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:

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
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

dúvida em select

Mensagempor NiltonGM » 26 Jan 2017 10:03

Amigo, não compreendi exatamente o que você está querendo... enquanto isso, dá uma otimizada no seu select desse jeito:
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
Avatar de usuário

NiltonGM
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 393
Data de registro: 05 Jun 2014 23:47
Cidade/Estado: Caieiras/SP
Curtiu: 249 vezes
Mens.Curtidas: 24 vezes

dúvida em select

Mensagempor cjp » 26 Jan 2017 14:39

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:

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
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

dúvida em select

Mensagempor NiltonGM » 26 Jan 2017 15:05

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
Avatar de usuário

NiltonGM
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 393
Data de registro: 05 Jun 2014 23:47
Cidade/Estado: Caieiras/SP
Curtiu: 249 vezes
Mens.Curtidas: 24 vezes

dúvida em select

Mensagempor cjp » 26 Jan 2017 18:12

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:

U122
B411
S355
O222
U544
N177
U611
...


Ficaria assim:

U122
S355
B411
U544
O222
U611
N177
...
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

dúvida em select

Mensagempor NiltonGM » 26 Jan 2017 20:10

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 de usuário

NiltonGM
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 393
Data de registro: 05 Jun 2014 23:47
Cidade/Estado: Caieiras/SP
Curtiu: 249 vezes
Mens.Curtidas: 24 vezes

dúvida em select

Mensagempor JoséQuintas » 26 Jan 2017 21:55

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

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18015
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

dúvida em select

Mensagempor NiltonGM » 27 Jan 2017 16:04

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
Avatar de usuário

NiltonGM
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 393
Data de registro: 05 Jun 2014 23:47
Cidade/Estado: Caieiras/SP
Curtiu: 249 vezes
Mens.Curtidas: 24 vezes

dúvida em select

Mensagempor cjp » 27 Jan 2017 18:25

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
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

dúvida em select

Mensagempor alxsts » 27 Jan 2017 22:38

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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

dúvida em select

Mensagempor cjp » 27 Jan 2017 22:59

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
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

dúvida em select

Mensagempor alxsts » 30 Jan 2017 14:41

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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

dúvida em select

Mensagempor cjp » 30 Jan 2017 14:54

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
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

dúvida em select

Mensagempor alxsts » 30 Jan 2017 16:23

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...
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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

dúvida em select

Mensagempor cjp » 30 Jan 2017 16:37

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

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
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Próximo



Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 15 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro