Subquery MySQL

Forum sobre SQL.

Moderador: Moderadores

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

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 3107
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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 3107
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: 3107
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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 565
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: 3107
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