Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Beraldo

[Resolvido] Join sem, necessariamente, relação entre as tabelas

Recommended Posts

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.