а попробуйте так, пишу без проверки могут быть ошибки (но смысл надеюсь понятен):
SELECT
p.`id`,
p.`name`,
p.`category_id`,
v.`name` AS vendor,
p.`price_ya`,
pp.`value` AS price,
pp.`fix_currency_id`,
ph.`id` AS `photo`,
px.`status`
FROM
`products_prices` AS pp,
`xml_products` AS px
LEFT JOIN (
SELECT
sph.`product_id`,
MIN(sph.`pos`) AS min_pos
FROM `products_photos` AS sph
GROUP BY sph.`product_id`
) AS tph
ON tph.`product_id` = p.`id`
LEFT JOIN `products_photos` AS ph
ON ph.`product_id` = tph .`product_id`
AND ph.`pos` = tph.`min_pos`
LEFT JOIN `vendors` AS v
ON p.`vendor_id`=v.`id`
WHERE
pp.`price_id`='2'
AND p.`id`=pp.`product_id`
AND p.`id`=px.`product_id`
AND px.`site_id`='2'
P.S. подразумевается что связка product_id+pos уникальна.