Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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

  • Conteúdo Similar

    • Por FabianoSouza
      Tenho a tabela VAGAS e a tab INSCRITOS.
       
      Preciso fazer um SELECT para retornar as Vagas e a quantidade de candidatos inscritos para cada VAGA.
       
      Fazendo isso retorna duplicidade de Vagas... :-(
       
      select V.empresa, COunt(CIV.cdVaga) AS insc from dbo.vagas AS V LEFT JOIN dbo.inscVaga AS CIV ON V.codigo = CIV.cdVaga GROUP BY V.codigo, V.empresa Como monto essa consulta??
    • Por Omar~
      Estou com a tarefa de elaborar uma leitura no banco de dados e não estou conseguindo achar uma solução para a instrução de leitura.
      Basicamente tenho uma tabela que de produtos, nela tenho uma coluna para registrar o vendedor e outra para registrar o comprador assim associar esses valores com a tabela de usuários.
      Digamos assim:
      SELECT produto.id, produto.vendedor, produto.comprador, usuarios.id, usuarios.nome FROM produto INNER JOIN usuarios ON produto.vendedor = usuarios.id Com isso tenho a informação do vendedor na tabela de usuários, mas como faria para obter os dados do comprador também?
       
      Uma forma seria executar dois joins na tabela de usuários porém acho que assim me parece mais gabiarra do que o jeito mais coeso de se fazer  (e na verdade foi gabiarra sim porque não sei como proceder)
      Tipo assim:
      SELECT produto.id, produto.vendedor, produto.comprador, a.id AS a_id, a.nome AS a_nome, b.id AS b_id, b.nome AS b_nome FROM produto INNER JOIN usuarios AS a ON produto.vendedor = a.id INNER JOIN usuarios AS b ON produto.comprador = b.id Tem outro jeito? Como?
    • Por Omar~
      Blz...?
      Vejamos essa query:
      SELECT postagem.id, postagem.link, postagem.autor, postagem.editor, usuario.id, usuario.nome FROM postagem INNER JOIN usuario ON postagem.autor = usuario.id Então estou buscando pelos dados da postagem e o autor da mesma.
      A questão é:
      Tenho uma tabela "postagem" que guarda informação do "autor" da postagem e quem a editou "editor"
      Com essa query consigo trazer o resultado da tabela usuario dano a referencia do autor.
      Mas como eu faria para ter os dados do "autor" e do "editor" na tabela "usuario"?
      Preciso obter os nomes de quem criou e quem editou.
    • Por r.guerra
      Salve galera, boa tarde a todos.
      estou tendo um problema que ainda nao consegui enxergar... faço uma consulta mysql que funciona normalmente no proprio ambiente(mysql) mas ao solicitar a exibição do campo via php gera nao exibe e me tras um alerta.
       
      ****codigo php
      function monta_avaliacao($cpf){
          $query = mysqli_query($_SESSION["conector"],"SELECT c.*, a. cliente AS clientes FROM clientes AS c INNER JOIN avaliacoes AS a ON c.id = a.cliente WHERE c.cpf='$cpf'");
           $dados = mysqli_fetch_assoc($query);
          print $dados['c.cpf'];
           }
       
      *****sainda no html
      Notice: Undefined index: c.cpf in C:\xampp\htdocs\acus\inclusoes\funcoes.php on line 29
      Notice: Undefined index: a.pe in C:\xampp\htdocs\acus\inclusoes\funcoes.php on line 30
       
      tenho um arquivo com as funções, e apenas mando os parametros.
    • Por Omar~
      Primeiro a situação porque é difícil de explicar:
      Preciso realizar uma query em duas tabelas uma de pergunta (tabela_A) outra de resposta (tabela_B) usando o operador LIKE
      Ambas possuem uma coluna para o conteúdo, a tabela_A possui também uma coluna para título.
      A tabela_b é possui uma coluna para se relacionar com a tabela_A.
      Então digamos que na tabela_A tenho a seguinte questão:
       
      tabela_A
      Título: João foi ao mercado?
      Conteúdo (pergunta): Alguém sabe se ele comprou arroz?
      tabela_B
      Conteúdo (resposta): Eu vi que joão comprou feijão.
       
      A consulta então seria pela palavra chave joão que poderia está presente nas 2 tabelas e em 3 colunas.
      Tentei da seguinte forma montar a query:
      SELECT tabela_A.id, tabela_A.titulo, tabela_A.pergunta, tabela_B.relacao, tabela_B.resposta FROM tabela_A INNER JOIN tabela_B ON tabela_A.id = tabela_B.relacao WHERE tabela_B.resposta LIKE '%joão%' OR ( tabela_A.titulo LIKE '%joão%' OR tabela_A.pergunta LIKE '%joão%' ) Os problemas são se eu passar o comando ON para relacionar a resposta com a pergunta:
      A query não retorna se não houver dados na tabela_B.
      A query só retorna resultado se for buscado dados pela coluna resposta (mesmo existindo a palavra chave nas colunas citadas da tabela_A).
       
      A questão é:
      Como eu realizaria essa consulta?
      Se a palavra chave for encontrado na coluna titulo, pergunta ou resposta, de forma a que eu irei listar a coluna_A.
      Exemplo:
      Pesquisou por Maria, no título não tem, na pegunta não tem, na resposta tem.
      Pesquisou por Luiz, no título tem,  na pegunta não tem, na resposta não tem.
       
      Ou seja em qualquer um dos campos de ambas colunas que houver a chave de consulta deve retornar dados da coluna_A, mesmo que seja uma resposta na coluna_B.
       
      A forma que estou procedendo mesmo dando o resultado esperado não acho adequado acredito que uma query bastaria.
      Consultar tabela_A pelos campos tilulo e pergunta.
      Consultar tabela_B pelo campo resposta.
      Usar a função no PHP array_merge para unir ambos resultados em um único array.
      Remover os índices duplicados do array unificado.
×

Informação importante

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