Página 1 de 2

dúvida em select

Enviado: 24 Jan 2017 14:47
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?

dúvida em select

Enviado: 26 Jan 2017 11:03
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?]

dúvida em select

Enviado: 26 Jan 2017 15:39
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?

dúvida em select

Enviado: 26 Jan 2017 16:05
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

dúvida em select

Enviado: 26 Jan 2017 19:12
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
...

dúvida em select

Enviado: 26 Jan 2017 21:10
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"?

dúvida em select

Enviado: 26 Jan 2017 22:55
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 ) )

dúvida em select

Enviado: 27 Jan 2017 17:04
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.

dúvida em select

Enviado: 27 Jan 2017 19:25
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.

dúvida em select

Enviado: 27 Jan 2017 23:38
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.

dúvida em select

Enviado: 27 Jan 2017 23:59
por cjp
US pode ser F, K, M, S, U ou X.

Não uso ADO, uso RDDINFO.

O que seria uma stored procedure?

dúvida em select

Enviado: 30 Jan 2017 15:41
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`?

dúvida em select

Enviado: 30 Jan 2017 15:54
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.

dúvida em select

Enviado: 30 Jan 2017 17:23
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"

dúvida em select

Enviado: 30 Jan 2017 17:37
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"