Прежде всего, вам вообще не нужно LEFT JOIN
.
Во-вторых, ваша первая попытка кажется совершенно правильной, и я думаю, что она наиболее эффективна (когда есть таблицы для таблиц, которые нужно объединить).Но я добавляю другой способ (который кажется более простым, поскольку он имеет только 1 объединение).
Простой (чтобы добавить более 3 характеристик):
SELECT p.*
FROM products AS p
INNER JOIN characteristics AS c ON ...
WHERE c.id IN (1, 3, 6)
GROUP BY p.id
HAVING
COUNT(*) = 3 --- or COUNT(DISTINCT c.id)
--- depending on your data
Подробнее эффективно (другими словами, другими словами: тестируйте, тестируйте и тестируйте снова в своих таблицах с различными размерами и числом идентификаторов):
SELECT p.*
FROM products AS p
INNER JOIN characteristics AS c1 ON ...
INNER JOIN characteristics AS c2 ON ...
INNER JOIN characteristics AS c3 ON ...
WHERE c1.id = 1
AND c2.id = 3
AND c3.id = 6