Jump to content
Gonçalo_ssb

MYSQL e LEFT JOIN

Recommended Posts

Gonçalo_ssb

Boa noite,

Na tentativa de reunir o máximo de informação possível numa única query, estou a tentar unir 3 tabelas que são:

Service

service_id(PK)

Sitter_Service

service_id(PK)

sitter_id(PK)

Reserve

reserve_id(PK)

service_id(PK)

O que pretendo é saber através da tabela Service, quantos registos existem nas outras tabelas, ou seja o numero de registos associados a um serviço (Podem não existir daí o LEFT JOIN). Para tal estou a utilizar a seguinte query:


SELECT s.service_id,
             s.service_name,
             count(si.sitter_id) AS num_sitters,
             count(r.reserve_id) AS num_reserves,
             s.creation_date,
             IF(s.service_publish_flag=1,'Sim','Não') AS publish
   FROM Service s LEFT JOIN Sitter_Service si ON s.service_id = si.service_id,
             Service se LEFT JOIN Reserve r ON se.service_id = r.service_id
WHERE s.created_by = a.administrator_id
     AND s.service_id = se.service_id 
     AND s.organization_id  = '1'
GROUP BY s.service_id
ORDER BY s.service_name ASC

O primeiro LEFT JOIN retorna os registos correctos, mas o segundo está completamente desproporcional. Onde estou a errar?

Obrigado.

gferraria.

Share this post


Link to post
Share on other sites
brunoais

O teu problema é que se o valor não existir na tabala q estás a usar para juntar á direita. Usa o FULL JOIN em vez do LEFT OUTER JOIN


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
mjamado

O teu problema é que se o valor não existir na tabala q estás a usar para juntar á direita. Usa o FULL JOIN em vez do LEFT OUTER JOIN

O MySQL não tem FULL JOIN.

Gonçalo_ssb, usa INNER JOIN em vez de LEFT JOIN. Mas confirma se queres mesmo fazer isso! Usa o EXPLAIN na query e verifica se alguma das tabelas tem as condições Using temporary; Using filesort. É o mais provável, e quer dizer problemas, big time. Isto é por causa dos GROUP BY e ORDER BY.

Na maioria dos casos, não ganhas grande coisa em fazer joins. Normalmente, devido aos agrupamentos e ordenações, até perdes. Considera fazer queries separadas e confronta os tempos de execução duma forma e de outra.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
brunoais

Na realidade o MYSQL supporta FULL OUTER JOINS mas só 1 FULL OUTER JOIN por querie :cheesygrin:

Usa Unions, uma coisa do tipo, para obter o mesmo:

SELECT * FROM a LEFT JOIN b ON a.id=b.id

UNION ALL

SELECT * FROM a RIGHT JOIN b ON a.id=b.id;


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
Gonçalo_ssb

Boa noite,

Antes de mais obrigado pelas sugestões, pois ajudaram a construir um melhor raciocínio

Aqui vai a solução:


SELECT sitter_info.service_id,
       sitter_info.service_name,
       sitter_info.num_sitters,
       res_info.num_reservas,
       sitter_info.creation_date,
       sitter_info.publish
  FROM(       
       SELECT s.service_id,
              s.service_name,
              COUNT(si.sitter_id) AS num_sitters,
              s.creation_date,
              IF(s.service_publish_flag=1,'Sim','Não') AS publish
         FROM Service s LEFT JOIN Sitter_Service si ON s.service_id = si.service_id
        WHERE s.organization_id  = '1'
     GROUP BY s.service_id) sitter_info,
      ( 
      SELECT s.service_id, 
             COUNT(r.reserve_id) AS num_reservas
             FROM Service s LEFT JOIN Reserve r ON s.service_id = r.service_id
       WHERE s.organization_id  = '1'
    GROUP BY s.service_id) res_info
WHERE sitter_info.service_id = res_info.service_id

.

Aceitam-se sugestões para melhorar.

Obrigado a todos.

Share this post


Link to post
Share on other sites
mjamado

Faz o EXPLAIN disso e até te assustas...  :cheesygrin:

Uncacheable queries, Using temporary, Using Filesort... Pelo menos estas devem aparecer...


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
Gonçalo_ssb

Pois,

Ao nível de performance não é lá muito favorável, mas não tenho uma solução melhor neste momento.

De qualquer das formas, podem fazer sugestões, eu estou cá para as discutir com vocês.

Obrigado.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.