Hi guys,

I have 2 tables "cars" and "parts" where car has many parts. I need a query to return some fields from the cars table as well as a field from multiple parts records. I've come to the following approaches, and would like to understand which is the better, and why, or if there's a 3rd and even better approach:

Approach 1 - subselects:

SELECT cars.id,
(SELECT parts.value FROM parts WHERE car_id = cars.id AND id = 3) AS part_3, (SELECT parts.value FROM parts WHERE car_id = cars.id AND id = 4) AS part_4
FROM cars
WHERE id = 2;

Approach 2 - joins:

SELECT cars.id, parts_3.value AS part_3, parts_4.value AS part_4
FROM cars
INNER JOIN parts AS parts_3 ON cars.id = parts_3.car_id
INNER JOIN parts AS parts_4 ON cars.id = parts_4.car_id
WHERE parts_3.id = 3
AND   parts_4.id = 4
AND   cars.id = 2;

I've tried to find out if joins are preferred over subselects, but am not able to come to a definite conclusion. I read that correlated subselects are bad, and I should go for the join, but I know the id of the record in the outer query and can hard code that into the subselect (if that makes a difference).

The EXPLAIN result only differs in that the select_type is SIMPLE in the JOIN approach, but PRIMARY/DEPENDENT SUBQUERY in the subselect approach.

Any tips much appreciated, the full example below.

Br,

Morten


CREATE TABLE cars (
  id integer,
  make varchar(32)
);

CREATE TABLE parts (
  id integer,
  car_id integer,
  value varchar(64)
);

INSERT INTO cars (id, make) VALUES (1, 'Ford');
INSERT INTO cars (id, make) VALUES (2, 'Honda');

INSERT INTO parts (id, car_id, value) VALUES (1, 1, 'Wheel');
INSERT INTO parts (id, car_id, value) VALUES (2, 1, 'Tire');
INSERT INTO parts (id, car_id, value) VALUES (3, 2, 'Wheel');
INSERT INTO parts (id, car_id, value) VALUES (4, 2, 'Tire');
INSERT INTO parts (id, car_id, value) VALUES (5, 2, 'Dice');

SELECT cars.id,
(SELECT parts.value FROM parts WHERE car_id = 2 AND id = 3) AS part_3, (SELECT parts.value FROM parts WHERE car_id = 2 AND id = 4) AS part_4
FROM cars
WHERE id = 2;

SELECT cars.id, parts_3.value AS part_3, parts_4.value AS part_4
FROM cars
INNER JOIN parts AS parts_3 ON cars.id = parts_3.car_id
INNER JOIN parts AS parts_4 ON cars.id = parts_4.car_id
WHERE parts_3.id = 3
AND   parts_4.id = 4
AND   cars.id = 2;


--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to