Ir para conteúdo
rd111072

Ordenar RIGHT JOIN por campo da segunda tabela

Recommended Posts

Olá, Rapaziada!

Tenho essa query:
 

SELECT 
GROUP_CONCAT('"', CASE WHEN id_usuario_consumo is null THEN id_usuario else id_usuario_consumo END, '"', ':' , CASE WHEN valor_consumo is null THEN 0 else valor_consumo END SEPARATOR ';') 
AS idev from usuarios_consumo RIGHT JOIN usuarios ON id_usuario = id_usuario_consumo AND data_consumo = '2017-02-01' ORDER BY id_usuario

Que está dando o resultado:

"11":23.20;"1":0.00;"8":0.00;"13":0.00

Ou seja, está aparecendo primeiro o id_usuario_consumo "11", mas eu preciso que apareça na ordem crescente por id_usuario (1, 8, 11, 13...). Eu coloquei um order by no final mas não adiantou. Acho que porque esses outros ids não tem registro na primeira tabela (usuarios_consumo) nas condições dadas, só na segunda (usuarios).

Alguém sabe como fazer?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você não deveria fazer o select na usuarios e depois fazer um left join com a usuarios consumo? Pois o que me parece é que o id_usuario está vindo null por isso fica em primeiro na ordenação.

 

tenta fazer um id alias e ordenar por ele, um exemplo:

SELECT IF(id_usuario_consumo is null, id_usuario, id_usuario_consumo) AS idPersonalizado .... ORDER BY idPersonalizado

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
23 minutos atrás, rockrgo disse:

Você não deveria fazer o select na usuarios e depois fazer um left join com a usuarios consumo? Pois o que me parece é que o id_usuario está vindo null por isso fica em primeiro na ordenação.

 

tenta fazer um id alias e ordenar por ele, um exemplo:


SELECT IF(id_usuario_consumo is null, id_usuario, id_usuario_consumo) AS idPersonalizado .... ORDER BY idPersonalizado

 

Não. O que está vindo primeiro é o que consta na usuarios_consumo. Os que estão com valor 0 após os : , os que constam somente na tabela usuarios.
Preciso que ordene por ordem crescente de id, independente de que tabela vem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então sua query deveria estar assim

SELECT 
GROUP_CONCAT('"', CASE WHEN uc.id_usuario_consumo is null THEN u.id_usuario else uc.id_usuario_consumo END, '"', ':' , CASE WHEN uc.valor_consumo is null THEN 0 else uc.valor_consumo END SEPARATOR ';') AS idev 
FROM usuarios u 
LEFT JOIN usuarios_consumo uc ON u.id_usuario = uc.id_usuario_consumo AND uc.data_consumo = '2017-02-01'
ORDER BY u.id_usuario

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
14 minutos atrás, rockrgo disse:

Então sua query deveria estar assim


SELECT 
GROUP_CONCAT('"', CASE WHEN uc.id_usuario_consumo is null THEN u.id_usuario else uc.id_usuario_consumo END, '"', ':' , CASE WHEN uc.valor_consumo is null THEN 0 else uc.valor_consumo END SEPARATOR ';') AS idev 
FROM usuarios u 
LEFT JOIN usuarios_consumo uc ON u.id_usuario = uc.id_usuario_consumo AND uc.data_consumo = '2017-02-01'
ORDER BY u.id_usuario

 

Não...

O resultado continua igual:

"11":23.20;"1":0.00;"8":0.00;"13":0.00

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 10/02/2017 at 12:07, rockrgo disse:

Faz um select sem o concat pegando os dados que você precisa e vê o que está vindo, posta o resultado aqui.


Aqui, sem o CONCAT:

 

SELECT (CASE WHEN uc.id_usuario_consumo is null THEN u.id_usuario else uc.id_usuario_consumo END) as id, (CASE WHEN uc.valor_consumo is null THEN 0 else uc.valor_consumo END) AS valor FROM usuarios u LEFT JOIN usuarios_consumo uc ON u.id_usuario = uc.id_usuario_consumo AND uc.data_consumo = '2017-02-01' ORDER BY u.id_usuario 


O resultado:

id | valor

1 | 0.00

8 | 0.00

11 | 23.20

13 | 0.00

Compartilhar este post


Link para o post
Compartilhar em outros sites

Da uma olhada nestes exemplos.

http://www.w3resource.com/mysql/aggregate-functions-and-grouping/aggregate-functions-and-grouping-group_concat.php

 

Pelo que vi você consegue usar um order by dentro do GROUP_CONCAT, só tenta adaptar com seu CASE.

SELECT 
GROUP_CONCAT('"', CASE WHEN uc.id_usuario_consumo is null THEN u.id_usuario else uc.id_usuario_consumo END, '"', ':' , CASE WHEN uc.valor_consumo is null THEN 0 else uc.valor_consumo END ORDER BY u.id_usuario ASC SEPARATOR ';') AS idev 
FROM usuarios u 
LEFT JOIN usuarios_consumo uc ON u.id_usuario = uc.id_usuario_consumo AND uc.data_consumo = '2017-02-01'

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por lemanoel
      oi, sou novo por aqui! desculpe se a pergunta é muito simples.... tenho duas tabelas:
      TABELA: atendimento: cd_item data_atend nome_cliente TABELA: documento_clinico cd_doc cd_item data_doc  
      o tenho a relação 1 atendimento para muitos docs. Quero criar um código que diz o número do atendimento e a data do doc mais antigo (apenas 1).  todas as tentativas duplicam o nome do cliente
    • Por mnunesd12
      Ola Pessoal, 
      Recentemente comecei a estudar banco de dados por conta própria, para isso estou utilizando o mysql e "brincando" com o banco de dados de uma locadora que vem de exemplo no mysql, chamado sikila.
      Eu queria saber como eu faço uma query para selecionar os todos os clientes que já alugaram o mesmo filme em momentos diferentes.
       
      Select fm.film_id, fm.title cus.customer_id, concat( cus.first_name, " ", cus.last_name) as Nome from film as fm inner join inventory as inv on fm.film_id = inv.film_id inner join rental as rt on inv.inventory_id = rt.inventory_id inner join customer as cus on rt.customer_id = cus.customer_id Where rt.customer_id = 49 and rt.customer_id = 127 Nessa query eu sei que os customers números 49 e 127, já alugaram o mesmo filme, porém, não sei por qual motivo, a query não resulta em nada.
      Caso necessitem de mais informações fiquem à vontade para solicitar.
      Obrigado pela ajuda
       
    • Por luizfabianochaves
      buenas pessoal..
       
      estou com um problema em um comparativo entre duas tabelas.. uma tabela eu tenho o o resultado das metas e do mix de produtos vendidos na empresa.. calça, camisa, casacos.. etc..
      na outra tabela esta o resultado da venda desses produtos.. preciso de um comparativo que me dê o resultado do que foi vendido.. mas o que não foi vendido liste tambem.. quando comparo a coluna MIX_PRODUTO como igual ela traz o resultado da venda correta mas só o que o representante vendeu.. como está na imagem..
      quando comparo como diferente ele traz todo o mix.. mas ele lista a soma da venda para todo o mix no caso ali embaixo 110 peças e diminui a quantidade vendida... 
      o que preciso é que fique como na segunda imagem.. listando todo o mix, mas aparecendo somente a venda que tem na imagem 1... me fiz entender?
      SELECT  A.CD_MARCA, A.DS_MARCA, A.CD_REPRESENTANTE, A.NM_REPRESENTANTE ,A.DS_MUNICIPIO ,A.DS_SIGLA_EST ,A.CD_CLIENTE ,A.NM_CLIENTE,D.MIX_PRODUTO ,SUM(A.QT_SALDO) as QT_REAL FROM IM_DEMANDA A INNER JOIN IM_PERFORMANCE_MIX D ON (D.CD_PERIODO = A.CD_PERIODO) AND (D.CD_MARCA = A.CD_MARCA) AND (D.CD_REPRESENTANTE = A.CD_REPRESENTANTE) AND (D.MIX_PRODUTO = A.MIX_PRODUTO) WHERE A.CD_CLIENTE = '379' AND A.CD_MARCA = '3' AND A.CD_PERIODO = '8' GROUP BY A.CD_MARCA, A.DS_MARCA, A.CD_REPRESENTANTE, A.NM_REPRESENTANTE, A.DS_MUNICIPIO, A.DS_SIGLA_EST ,A.CD_CLIENTE ,A.NM_CLIENTE ,D.MIX_PRODUTO
      SELECT  A.CD_MARCA, A.DS_MARCA, A.CD_REPRESENTANTE, A.NM_REPRESENTANTE ,A.DS_MUNICIPIO ,A.DS_SIGLA_EST ,A.CD_CLIENTE ,A.NM_CLIENTE,D.MIX_PRODUTO ,SUM(A.QT_SALDO) as QT_REAL FROM IM_DEMANDA A INNER JOIN IM_PERFORMANCE_MIX D ON (D.CD_PERIODO = A.CD_PERIODO) AND (D.CD_MARCA = A.CD_MARCA) AND (D.CD_REPRESENTANTE = A.CD_REPRESENTANTE) AND (D.MIX_PRODUTO <> A.MIX_PRODUTO) WHERE A.CD_CLIENTE = '379' AND A.CD_MARCA = '3' AND A.CD_PERIODO = '8' GROUP BY A.CD_MARCA, A.DS_MARCA, A.CD_REPRESENTANTE, A.NM_REPRESENTANTE, A.DS_MUNICIPIO, A.DS_SIGLA_EST ,A.CD_CLIENTE ,A.NM_CLIENTE ,D.MIX_PRODUTO
       
    • Por joelzsbit
      Pessoal, como que faço para gravar a ordem das imagens que foi ordenada com o mouse, usando esse codigo:
      <!DOCTYPE HTML> <html> <head> <style> #div1, #div2, #div3 { float: left; width: 100px; height: 35px; margin: 10px; padding: 10px; border: 1px solid black; } </style> <script> function allowDrop(ev) { ev.preventDefault(); } function drag(ev) { ev.dataTransfer.setData("text", ev.target.id); } function drop(ev) { ev.preventDefault(); var data = ev.dataTransfer.getData("text"); ev.target.appendChild(document.getElementById(data)); } </script> </head> <body> <h2>Drag and Drop</h2> <p>Drag the image back and forth between the two div elements.</p> <div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"> <img src="/imagens/img_cod/924081810.gif" draggable="true" ondragstart="drag(event)" id="drag1" width="88" height="31"> </div> <div id="div2" ondrop="drop(event)" ondragover="allowDrop(event)"> <img src="/imagens/img_cod/924081810.gif" draggable="true" ondragstart="drag(event)" id="drag1" width="88" height="31"> </div> <div id="div3" ondrop="drop(event)" ondragover="allowDrop(event)"></div> </body> </html>  
    • Por flavionorvel
      Assim, vamos receber um vetor de 100 posições de números inteiros, processar a classificação deste vetor em ordem crescente.
      Fazer de forma que o usuário (cliente) possa voltar e executar a classificação com outros números.
       
      CONCEITOS:
      1)     Mostrar o vetor em sua forma de entrada (sem ordenar);
      2)     Mostrar o vetor ordenado crescente.
      3)     Criar as seguintes funções:
      uma função para validar corretivamente para termos somente números positivos. Uma função para validar corretivamente a resposta para << s >> ou << n >>.
×

Informação importante

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