Gonçalo_ssb 1 Posted November 25, 2010 Report Share Posted November 25, 2010 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. Link to post Share on other sites
brunoais 65 Posted November 25, 2010 Report Share Posted November 25, 2010 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%. Link to post Share on other sites
mjamado 42 Posted November 25, 2010 Report Share Posted November 25, 2010 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. Link to post Share on other sites
brunoais 65 Posted November 25, 2010 Report Share Posted November 25, 2010 Na realidade o MYSQL supporta FULL OUTER JOINS mas só 1 FULL OUTER JOIN por querie 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%. Link to post Share on other sites
Gonçalo_ssb 1 Posted November 26, 2010 Author Report Share Posted November 26, 2010 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. Link to post Share on other sites
mjamado 42 Posted November 26, 2010 Report Share Posted November 26, 2010 Faz o EXPLAIN disso e até te assustas... 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. Link to post Share on other sites
Gonçalo_ssb 1 Posted November 26, 2010 Author Report Share Posted November 26, 2010 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. Link to post Share on other sites
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now