SELECT humans.id
, humans.first_name
, humans.middle_name
, humans.last_name
FROM humans
INNER JOIN ownerships ON ownerships.human_id = humans.id
INNER JOIN pets ON ownerships.pet_id = pets.id
WHERE pets.name = 'Bo'
GROUP BY humans.id
, humans.first_name
, humans.middle_name
, humans.last_name
;
+----+-------------+------------+--------+---------------+---------+---------+---------------------------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+--------+---------------+---------+---------+---------------------------+------+---------------------------------+
| 1 | SIMPLE | humans | ALL | PRIMARY | NULL | NULL | NULL | 9 | Using temporary; Using filesort |
| 1 | SIMPLE | ownerships | ref | PRIMARY | PRIMARY | 4 | dm_pets.humans.id | 1 | Using index |
| 1 | SIMPLE | pets | eq_ref | PRIMARY | PRIMARY | 4 | dm_pets.ownerships.pet_id | 1 | Using where |
+----+-------------+------------+--------+---------------+---------+---------+---------------------------+------+---------------------------------+
SELECT id
, first_name
, middle_name
, last_name
FROM humans
WHERE id IN(SELECT DISTINCT human_id FROM ownerships WHERE pet_id IN(SELECT id FROM pets WHERE name = 'Bo'))
;
+----+--------------------+------------+-----------------+---------------+---------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+------------+-----------------+---------------+---------+---------+------+------+--------------------------+
| 1 | PRIMARY | humans | ALL | NULL | NULL | NULL | NULL | 9 | Using where |
| 2 | DEPENDENT SUBQUERY | ownerships | index_subquery | PRIMARY | PRIMARY | 4 | func | 1 | Using index; Using where |
| 3 | DEPENDENT SUBQUERY | pets | unique_subquery | PRIMARY | PRIMARY | 4 | func | 1 | Using where |
+----+--------------------+------------+-----------------+---------------+---------+---------+------+------+--------------------------+
SELECT DISTINCT humans.id
, humans.first_name
, humans.middle_name
, humans.last_name
FROM humans
INNER JOIN ownerships ON ownerships.human_id = humans.id
INNER JOIN pets ON ownerships.pet_id = pets.id
WHERE pets.name = 'Bo'
;
+----+-------------+------------+--------+---------------+---------+---------+---------------------------+------+-----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+--------+---------------+---------+---------+---------------------------+------+-----------------------+
| 1 | SIMPLE | humans | ALL | PRIMARY | NULL | NULL | NULL | 9 | Using temporary |
| 1 | SIMPLE | ownerships | ref | PRIMARY | PRIMARY | 4 | dm_pets.humans.id | 1 | Using index; Distinct |
| 1 | SIMPLE | pets | eq_ref | PRIMARY | PRIMARY | 4 | dm_pets.ownerships.pet_id | 1 | Using where; Distinct |
+----+-------------+------------+--------+---------------+---------+---------+---------------------------+------+-----------------------+