Beraldo 864 Denunciar post Postado Março 8, 2011 Estou apanhando para fazer um SELECT com um JOIN... :( É um sistema de sorteios. Basicamente, tenho a tabela Sorteios e Participantes (há outras sem importância aqui). sorteios mysql> select * from sorteios; +----+--------------------+---------------------+---------------------+-------------+-----------+ | id | nome | inicio | fim | ganhador | status | +----+--------------------+---------------------+---------------------+-------------+-----------+ | 1 | sorteio 1 | 2011-03-08 00:00:00 | 2011-03-15 00:00:00 | usuario 1 | encerrado | | 2 | sorteio do beraldo | 2011-03-09 04:00:00 | 2011-03-16 08:05:00 | | aberto | +----+--------------------+---------------------+---------------------+-------------+-----------+ 2 rows in set (0.00 sec) participantes mysql> select * from participantes; +----+------------+------------+-----------+ | id | id_usuario | id_sorteio | data_hora | +----+------------+------------+-----------+ | 1 | 1 | 1 | NULL | | 2 | 2 | 1 | NULL | | 3 | 3 | 1 | NULL | +----+------------+------------+-----------+ 3 rows in set (0.00 sec) Na tabela de participantes gravo o id do sorteio e o id do usuário parrticipante. quero selecionar TODOS os sorteios atuais e seus números de participantes. Notem que o sorteio de id 2 não possui participantes ainda. Logo, deve retornar 0 em 'participantes'. Com o select abaixo, em vez de retornar zero, o sorteio de id 2 simplesmente não aparece: mysql> select s.*, count(p.id_usuario) as participantes FROM sorteios as s LEFT JOIN participantes as p on s.id = p.id_sorteio; +----+-----------+---------------------+---------------------+-------------+-----------+---------------+ | id | nome | inicio | fim | ganhador | status | participantes | +----+-----------+---------------------+---------------------+-------------+-----------+---------------+ | 1 | sorteio 1 | 2011-03-08 00:00:00 | 2011-03-15 00:00:00 | twitloteria | encerrado | 3 | +----+-----------+---------------------+---------------------+-------------+-----------+---------------+ 1 row in set (0.00 sec) o que estou fazendo de errado? obrigado abraços, Beraldo --- edit Percebi que se eu retirar o count(), o LEFT JOIN traz o campo NULL como deveria: ysql> select s.*, p.id_usuario as participantes FROM participantes as p RIGHT JOIN sorteios as s ON s.id = p.id_sorteio; +----+--------------------+---------------------+---------------------+----------+--------+---------------+ | id | nome | inicio | fim | ganhador | status | participantes | +----+--------------------+---------------------+---------------------+----------+--------+---------------+ | 1 | sorteio 1 | 2011-03-08 00:00:00 | 2011-03-15 00:00:00 | | aberto | 1 | | 1 | sorteio 1 | 2011-03-08 00:00:00 | 2011-03-15 00:00:00 | | aberto | 2 | | 1 | sorteio 1 | 2011-03-08 00:00:00 | 2011-03-15 00:00:00 | | aberto | 3 | | 2 | sorteio do beraldo | 2011-03-09 04:00:00 | 2011-03-16 08:05:00 | | aberto | NULL | +----+--------------------+---------------------+---------------------+----------+--------+---------------+ 3 rows in set (0.00 sec) Isso quer dizer que o LEFT JOIN não se dá muito bem com o count(). Não sei se isso vai ajudar muito para achar a solução, mas achei interessante postar essa observação :) Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Março 8, 2011 Beraldo Não testei, mas acredito que um LEFT OUTER JOIN na primeira consulta deva resolver. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Março 8, 2011 Não testei, mas acredito que um LEFT OUTER JOIN na primeira consulta deva resolver. testei: select s.*, count(p.id_usuario) as participantes FROM sorteios as s LEFT OUTER JOIN participantes as p on s.id = p.id_sorteio Mas obtive o mesmo resultado :( Pessoal, consegui!! :D select s.*, count(p.id_usuario) as participantes FROM participantes as p RIGHT JOIN sorteios as s ON s.id = p.id_sorteio group by s.id; +----+--------------------+---------------------+---------------------+----------+--------+---------------+ | id | nome | inicio | fim | ganhador | status | participantes | +----+--------------------+---------------------+---------------------+----------+--------+---------------+ | 1 | sorteio 1 | 2011-03-08 00:00:00 | 2011-03-15 00:00:00 | | aberto | 2 | | 2 | sorteio do beraldo | 2011-03-09 04:00:00 | 2011-03-16 08:05:00 | | aberto | 0 | +----+--------------------+---------------------+---------------------+----------+--------+---------------+ 2 rows in set (0.00 sec) Fui testando um monte de coisa e resolveu usando group by e right join. Sinceramente, não entendi direito por quê, mas funcionou! :D Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Março 8, 2011 http://en.wikipedia.org/wiki/Join_%28SQL%29 Compartilhar este post Link para o post Compartilhar em outros sites