Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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 :)
Carregando comentários...