Subquery MySQL

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Subquery MySQL

Mensagem por JoséQuintas »

Este comando funcionou, mas achei esquisito misturar dois filtros em um.
Nem dá pra saber se faz a query completa pra depois filtrar, ou se o filtro tá valendo no primeiro agrupamento..

É isso mesmo?
Ou é o HeidiSql?

Código: Selecionar todos

select count(*) AS QTD FROM 

( 
   select 
	locador, locatario, sum(rateio) as soma 
	from hldimrat 
	group by locador, locatario 
	
) AS resultado 

where soma = 100 and locador=3304
O resultado deu certo. retornou apenas desse locador, e a quantidade de locatários com rateio somando 100%.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Subquery MySQL

Mensagem por JoséQuintas »

Agora que entendi é isso mesmo, e faz o total.

Primeiro vai fazer esta

Código: Selecionar todos

 select 
locador, locatario, sum(rateio) as soma  
from hldimrat  
group by locador, locatario  
AS resultado  
E depois esta

Código: Selecionar todos

select COUNT(*) as QTD from RESULTADO where soma=100 AND locador=3304
Ruim isso.
Deveria poder usar o WHERE no subselect, pra ser mais rápido.
Tudo bem que 1 segundo não é muito, mas seria trabalho à toa somar todos os outros.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Subquery MySQL

Mensagem por JoséQuintas »

Ok, resolvido.

Tava colocando o where depois do group by, e por isso não aceitava.
Agora sim.

Código: Selecionar todos

select count(*) AS QTD FROM 

( 
 select 
 locador, locatario, sum(rateio) as soma 
 from hldimrat 
 where locador=3304
 group by locador, locatario 
 
) AS resultado 

where soma = 100
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Subquery MySQL

Mensagem por alxsts »

Olá!

Assim fica mais lógico e rápido:

Código: Selecionar todos

select count(*) AS QTD FROM 
( 
 select 
 locador, locatario, sum(rateio) as soma 
 from hldimrat 
 where locador=3304 AND soma = 100
 group by locador, locatario 
) AS resultado
A ordem correta das cláusulas, quando necessárias, é sempre WHERE, GROUP BY, HAVING e, sempre por último, ORDER BY.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Subquery MySQL

Mensagem por JoséQuintas »

Estranharia se funcionasse.
Não dá pra aplicar esse where, porque não existe o campo SOMA no banco de dados.
mysql.png
Não lembro pra que serve o HAVING, não seria pra algo assim?.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Subquery MySQL

Mensagem por JoséQuintas »

Achei um exemplo.

Código: Selecionar todos

SELECT name, COUNT(name) AS c FROM orders
  GROUP BY name
  HAVING c = 1;
E testei isto e foi.

Código: Selecionar todos

select count(*) AS QTD FROM 

( 
 select 
 locador, locatario, sum(rateio) as soma 
 from hldimrat 
 where locador=3304
 group by locador, locatario having soma=100
 
) AS resultado 
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Subquery MySQL

Mensagem por alxsts »

Olá!

Funcionaria assim:

Código: Selecionar todos

select count(*) AS QTD FROM 
( 
 select 
 locador, locatario, sum(rateio) as soma 
 from hldimrat 
 where locador=3304 AND sum(rateio) = 100
 group by locador, locatario 
) AS resultado
Mas a solução mais correta mesmo é esta última, com HAVING.

Em SQL, WHERE filtra linhas e HAVING filtra grupos de linhas e por isto sempre vem após um GROUP BY.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Subquery MySQL

Mensagem por alxsts »

Olá!

Este exemplo que você postou é a base para localizar registros com mais de uma ocorrência em uma tabela. É só trocar o sinal de igual a por maior que.

Código: Selecionar todos

SELECT name, COUNT(name) AS c 
  FROM orders
 GROUP BY name
 HAVING c > 1;
O código acima lista nomes repetidos na tabela Orders.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Subquery MySQL

Mensagem por JoséQuintas »

Aquele exemplo encontrei no site do MySQL.

No meu caso, o locador tem vários locatários.
E em cada locatário é definido rateio pra uma ou mais pessoas, colocando percentual em cada pessoa.
O comando é pra pegar quantos locatários de um locador tem o preenchimento de 100%.

Código: Selecionar todos

locador JOAO
   locatário JUCA ===> aqui soma 60%
       rateio 10% FILHO CHICO
       rateio 20% FILHO ANTONIO
       rateio 30% FILHA MARIA
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Subquery MySQL

Mensagem por JoséQuintas »

Ok, li rápido seu post e me confundi.
Este exemplo que você postou é a base
ele serve como base para pesquisar duplicados.

Já tinha me perguntado como fazer isso, e nem reparei.
Bem observado.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Subquery MySQL

Mensagem por Poka »

Quintas e Alexandre

Muito útil esses tipos de comentários.

Vamos aprendendo aqui também

Um abraço

Poka
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Subquery MySQL

Mensagem por alxsts »

Olá!

Valeu Poka! Obrigado pelo incentivo.
[]´s
Alexandre Santos (AlxSts)
Responder