Considere as seguintes consultas:
mysql> SELECT count(*) FROM list l WHERE l.source='blink';
+----------+
| count(*) |
+----------+
| 3372 |
+----------+
1 row in set (0.00 sec)
mysql> SELECT count(*) FROM list l LEFT JOIN cardinal c ON l.id=c.id WHERE c.resolution IN ('Left','Right','Up') AND l.source='blink';
+----------+
| count(*) |
+----------+
| 5116 |
+----------+
1 row in set (2.47 sec)
Não houve nenhuma INSERT
ou outras consultas executadas no banco de dados entre essas duas consultas em execução. A segunda consulta parece mais restritiva que a primeira, então como ela poderia retornar mais linhas? Observe que a list
tabela tem mais de 2 milhões de linhas e cardinal
cerca de meio milhão de linhas.
EDIT: Adicionando EXPLAIN
saída:
mysql> EXPLAIN SELECT count(*) FROM list l LEFT JOIN cardinal c ON l.id=c.id WHERE c.resolution IN ('Left','Right','Up') AND l.source='blink';
+----+-------------+-------+--------+-------------------+---------+---------+-------------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-------------------+---------+---------+-------------+--------+-------------+
| 1 | SIMPLE | c | ALL | NULL | NULL | NULL | NULL | 536258 | Using where |
| 1 | SIMPLE | l | eq_ref | PRIMARY,id,source | PRIMARY | 8 | direct.c.id | 1 | Using where |
+----+-------------+-------+--------+-------------------+---------+---------+-------------+--------+-------------+
2 rows in set (0.00 sec)
mysql> select count(*) from list;
+----------+
| count(*) |
+----------+
| 2165664 |
+----------+
1 row in set (1.32 sec)
mysql> select count(*) from cardinal;
+----------+
| count(*) |
+----------+
| 537007 |
+----------+
1 row in set (0.23 sec)
Cada linha na primeira tabela pode corresponder a mais de uma linha na segunda tabela.
Você pode verificar isso com:
Uma pequena demonstração está no SQL Fiddle aqui .
Seu problema não está vinculado a você adicionar restrições, mas com o JOIN.
Quando uma linha da tabela
l
tem, por exemplo, 3 linhas correspondentes emc
, três linhas seriam adicionadas ao conjunto de resultados.