Rob,

On 1/4/2011 4:28 PM, Rob Marscher wrote:
insert into parent (name) values ('One'),('Two'),('Three');
insert into child1 (parent_id) values (1),(1),(1),(3);
insert into child2 (parent_id) values (2),(2),(2),(3);

explain select parent.id, parent.name, count(child1.id), count(child2.id)
from parent force index (primary)
left join child1 on parent.id = child1.parent_id
left join child2 on parent.id = child2.parent_id
group by parent.id;

+----+-------------+--------+-------+---------------+---------+---------+--------------------------+------+-------+
| id | select_type | table  | type  | possible_keys | key     | key_len | ref   
                   | rows | Extra |
+----+-------------+--------+-------+---------------+---------+---------+--------------------------+------+-------+
|  1 | SIMPLE      | parent | index | NULL          | PRIMARY | 4       | NULL  
                   |    1 |       |
|  1 | SIMPLE      | child1 | ref   | parent        | parent  | 4       | 
brightbu_namco.parent.id |    2 |       |
|  1 | SIMPLE      | child2 | ref   | parent        | parent  | 4       | 
brightbu_namco.parent.id |    2 |       |
+----+-------------+--------+-------+---------------+---------+---------+--------------------------+------+-------+
+----+-------+------------------+------------------+
| id | name  | count(child1.id) | count(child2.id) |
+----+-------+------------------+------------------+
|  1 | One   |                3 |                0 |
|  2 | Two   |                0 |                3 |
|  3 | Three |                1 |                1 |
+----+-------+------------------+------------------+

This is demonstrating 2 special cases which will work properly:

1. no rows for a parent in one of the child tables
2. 1 row for a parent in both child tables

If you run your child inserts again to create more rows you'll end up with a count of 4 instead of 2 in the 3rd row.

If you remove the count()s you can see why this is the case:

SELECT parent.id, parent.name, child1.id, child2.id
FROM parent FORCE INDEX (PRIMARY )
LEFT JOIN child1 ON parent.id = child1.parent_id
LEFT JOIN child2 ON parent.id = child2.parent_id;

+----+-------+------+------+
| id | name  | id   | id   |
+----+-------+------+------+
|  1 | One   |    1 | NULL |
|  1 | One   |    2 | NULL |
|  1 | One   |    3 | NULL |
|  1 | One   |    5 | NULL |
|  1 | One   |    6 | NULL |
|  1 | One   |    7 | NULL |
|  2 | Two   | NULL |    1 |
|  2 | Two   | NULL |    2 |
|  2 | Two   | NULL |    3 |
|  2 | Two   | NULL |    5 |
|  2 | Two   | NULL |    6 |
|  2 | Two   | NULL |    7 |
|  3 | Three |    4 |    4 |
|  3 | Three |    4 |    8 |
|  3 | Three |    8 |    4 |
|  3 | Three |    8 |    8 |
+----+-------+------+------+

Dan
_______________________________________________
New York PHP Users Group Community Talk Mailing List
http://lists.nyphp.org/mailman/listinfo/talk

http://www.nyphp.org/Show-Participation

Reply via email to