imovel_custom
-------------------------------------
imovel_id key value
----------- ---------- ----------
1 transacao locacao
1 valor 10.0
1 area 120.0
2 transacao venda
2 valor 100.0
2 area 130.0
3 transacao venda
3 valor 110.0
3 area 140.0
4 transacao venda
4 valor 120.0
4 area 150.0
Lista com todos os tipos de transação:
SELECT
i.*, ic.*,
MAX(CASE WHEN ic.key = 'transacao' THEN ic.value ELSE NULL END) AS transacao,
MAX(CASE WHEN ic.key = 'valor' THEN ic.value ELSE NULL END) AS valor,
MAX(CASE WHEN ic.key = 'area' THEN ic.value ELSE NULL END) AS area
FROM
imovel AS i
LEFT JOIN
imovel_custom AS ic ON i.id_imovel = ic.imovel_id
WHERE
publicado='1'
GROUP BY
i.id_imovel
Count para paginação com todos os tipos de transação:
SELECT
COUNT(DISTINCT i.id_imovel) as total
FROM
imovel AS i
LEFT JOIN
imovel_custom AS ic ON i.id_imovel = ic.imovel_id
WHERE
publicado='1'
Resultado
---------------------------------------------------------------
total
---------
4
Lista com transação venda:
SELECT
i.*, ic.*,
MAX(CASE WHEN ic.key = 'transacao' THEN ic.value ELSE NULL END) AS transacao,
MAX(CASE WHEN ic.key = 'valor' THEN ic.value ELSE NULL END) AS valor,
MAX(CASE WHEN ic.key = 'area' THEN ic.value ELSE NULL END) AS area
FROM
imovel AS i
LEFT JOIN
imovel_custom AS ic ON i.id_imovel = ic.imovel_id
WHERE
publicado='1'
GROUP BY
i.id_imovel
FROM
imovel AS i
LEFT JOIN
imovel_custom AS ic ON i.id_imovel = ic.imovel_id
WHERE
publicado='1'
GROUP BY
i.id_imovel
HAVING
( MAX(CASE WHEN ic.key = 'transacao' THEN ic.value ELSE NULL END)='venda' )
Resultado
---------------------------------------------------------------
total
---------
1
1
1
Pergunta
FabioMSouza
Bom dia,
Segue um exemplo detalhado do problema, não consigo obter o total de registros para fazer a paginação.
Quero entender porque o count com filtro 'venda' feito com having me retorna 3 linhas em vez de pegar o total.
Desde já agradeço a ajuda! :)
imovel
-------------------------------------
id_imovel imovel publicado
----------- ---------- ------------
1 imovel 01 1
2 imovel 02 1
3 imovel 03 1
4 imovel 04 1
imovel_custom
-------------------------------------
imovel_id key value
----------- ---------- ----------
1 transacao locacao
1 valor 10.0
1 area 120.0
2 transacao venda
2 valor 100.0
2 area 130.0
3 transacao venda
3 valor 110.0
3 area 140.0
4 transacao venda
4 valor 120.0
4 area 150.0
Lista com todos os tipos de transação:
SELECT
i.*, ic.*,
MAX(CASE WHEN ic.key = 'transacao' THEN ic.value ELSE NULL END) AS transacao,
MAX(CASE WHEN ic.key = 'valor' THEN ic.value ELSE NULL END) AS valor,
MAX(CASE WHEN ic.key = 'area' THEN ic.value ELSE NULL END) AS area
FROM
imovel AS i
LEFT JOIN
imovel_custom AS ic ON i.id_imovel = ic.imovel_id
WHERE
publicado='1'
GROUP BY
i.id_imovel
Resultado
-------------------------------------------------------------------------
id_imovel imovel publicado transacao valor area
----------- ---------- ------------ ---------- ---------- ----------
1 imovel 01 1 locacao 10.0 120.0
2 imovel 02 1 venda 100.0 130.0
3 imovel 03 1 venda 110.0 140.0
4 imovel 04 1 venda 120.0 150.0
Count para paginação com todos os tipos de transação:
SELECT
COUNT(DISTINCT i.id_imovel) as total
FROM
imovel AS i
LEFT JOIN
imovel_custom AS ic ON i.id_imovel = ic.imovel_id
WHERE
publicado='1'
Resultado
---------------------------------------------------------------
total
---------
4
Lista com transação venda:
SELECT
i.*, ic.*,
MAX(CASE WHEN ic.key = 'transacao' THEN ic.value ELSE NULL END) AS transacao,
MAX(CASE WHEN ic.key = 'valor' THEN ic.value ELSE NULL END) AS valor,
MAX(CASE WHEN ic.key = 'area' THEN ic.value ELSE NULL END) AS area
FROM
imovel AS i
LEFT JOIN
imovel_custom AS ic ON i.id_imovel = ic.imovel_id
WHERE
publicado='1'
GROUP BY
i.id_imovel
HAVING
transacao='venda'
Resultado
-------------------------------------------------------------------------
id_imovel imovel publicado transacao valor area
----------- ---------- ------------ ---------- ---------- ----------
2 imovel 02 1 venda 100.0 130.0
3 imovel 03 1 venda 110.0 140.0
4 imovel 04 1 venda 120.0 150.0
Count para paginação com transação venda:
SELECT
COUNT(DISTINCT i.id_imovel) as total
FROM
imovel AS i
LEFT JOIN
imovel_custom AS ic ON i.id_imovel = ic.imovel_id
WHERE
publicado='1'
GROUP BY
i.id_imovel
HAVING
( MAX(CASE WHEN ic.key = 'transacao' THEN ic.value ELSE NULL END)='venda' )
Resultado
---------------------------------------------------------------
total
---------
1
1
1
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.