Clipper On Line • Ver Tópico - Subquery MySQL

Subquery MySQL

Discussão sobre SQL

Moderador: Moderadores

 

Subquery MySQL

Mensagempor JoséQuintas » 25 Ago 2016 20:09

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?

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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11880
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 757 vezes

Subquery MySQL

Mensagempor JoséQuintas » 25 Ago 2016 21:14

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

Primeiro vai fazer esta

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


E depois esta

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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11880
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 757 vezes

Subquery MySQL

Mensagempor JoséQuintas » 25 Ago 2016 21:26

Ok, resolvido.

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

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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11880
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 757 vezes

Subquery MySQL

Mensagempor alxsts » 26 Ago 2016 11:21

Olá!

Assim fica mais lógico e rápido:
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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2195
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 13 vezes
Mens.Curtidas: 151 vezes

Subquery MySQL

Mensagempor JoséQuintas » 26 Ago 2016 11:43

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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11880
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 757 vezes

Subquery MySQL

Mensagempor JoséQuintas » 26 Ago 2016 11:47

Achei um exemplo.

SELECT name, COUNT(name) AS c FROM orders
  GROUP BY name
  HAVING c = 1;


E testei isto e foi.

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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11880
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 757 vezes

Subquery MySQL

Mensagempor alxsts » 26 Ago 2016 11:53

Olá!

Funcionaria assim:
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: 2195
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 13 vezes
Mens.Curtidas: 151 vezes

Subquery MySQL

Mensagempor alxsts » 26 Ago 2016 12:00

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.
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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2195
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 13 vezes
Mens.Curtidas: 151 vezes

Subquery MySQL

Mensagempor JoséQuintas » 26 Ago 2016 12:18

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%.

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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11880
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 757 vezes

Subquery MySQL

Mensagempor JoséQuintas » 26 Ago 2016 12:26

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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11880
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 757 vezes

Subquery MySQL

Mensagempor Poka » 26 Ago 2016 13:51

Quintas e Alexandre

Muito útil esses tipos de comentários.

Vamos aprendendo aqui também

Um abraço

Poka
Avatar de usuário

Poka
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 384
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 16 vezes

Subquery MySQL

Mensagempor alxsts » 27 Ago 2016 13:59

Olá!

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

Colaborador
 
Mensagens: 2195
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 13 vezes
Mens.Curtidas: 151 vezes




Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 0 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro