Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?
>
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.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
>
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
Faz um select sem o concat pegando os dados que você precisa e vê o que está vindo, posta o resultado aqui.
>
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.00Da uma olhada nestes exemplos.
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'
Beleza, funcionou!
Agradecido!