Jump to content
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?

Share this post


Link to post
Share on other 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

 

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

 

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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'

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Danado_
      como eu seleciono da seguinte forma: 
       
      tabela cadastro;
      id 1 - fulano
      id 2 - bertano
      id 3 - fulaninho
      ---------------------------------------
      Observações:
      estou usando um select multiple e dou um insert into na tabela a abaixo ficando assim:
      ----------------------------------------
      tabela mesas
      id 1 - fulano, bertano
      -----------------------------------------

      ok até ai!
       
      AGORA QUE PRECISO DA AJUDA DE VOCÊS!
      preciso fazer um inner, left ou righ para TRAZER APENAS O  id 3 - fulaninho (no caso verificando as duas tabelas e selecionando apenas o que NAO foi selecionado!)
       
      tenho isso:
       
      <select name="nome[]" multiple> <?php $mapa = mysqli_query($con, "SELECT * FROM cadastro'"); while($dados = mysqli_fetch_assoc($mapa)){ ?> <option><?php echo $dados['nome']; ?></option> <?php } ?> </select>
       
    • By 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
    • By 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
       
    • By 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
       
    • By 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>  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.