Dado, as seguintes tabelas:
+--------------+
| CLASSES |
+==============+
| name | room |
+------+-------+
| 1A | A1.01 |
| 1B | NULL |
| 1C | A1.03 |
+------+-------+
+-------+
| ROOMS |
+=======+
| id |
+-------+
| A1.01 |
| A1.02 |
| A1.03 |
+-------+
Espero o seguinte resultado:
+--------------+
| UNUSED ROOMS |
+==============+
| id |
+--------------+
| A1.02 |
+--------------+
Como você faria isso usando uma associação externa?
Respostas:
1 para resposta № 1A consulta a seguir faz exatamente o que foi solicitado:
SELECT rooms.*
FROM rooms
LEFT JOIN classes ON rooms.id = classes.room
WHERE
classes.room IS NULL;
Tentando explicar o que está acontecendo aqui:
Depois de se juntar à esquerda classes
em rooms
, você obtém este resultado:
+--------------------------------------------+
| LEFT JOINED |
+============================================+
| rooms.id | classes.name | classes.room |
+-------------+--------------+---------------+
| A1.01 | 1A | A1.01 |
| A1.02 | NULL | NULL |
| A1.03 | 1C | A1.03 |
+-------------+--------------+---------------+
Como a junção esquerda retorna todos registros da mesa esquerda (que é rooms
), mesmo se rooms.id
não combina classes.room
uma vez que o último é nulo, o rooms
colunas ainda serão retornadas. Pense nisso classes.name
também é nulo, pois o registro não foi correspondido. Eu sei que isso é um pouco confuso para iniciantes. (Como eu, só queria compartilhar minha experiência. Desculpe por parecer um pouco confuso)
Como você pode ver, tudo o que precisa ser feito a partir daqui é filtrar o classes
Onde room
é nulo.
+--------------+
| UNUSED ROOMS |
+==============+
| id |
+--------------+
| A1.02 |
+--------------+