Использовать row_number()
:
SELECT p.*, pi.*
FROM `portfolio` LEFT OUTER JOIN
(SELECT pi.*,
ROW_NUMBER() OVER (PARTITION BY portfolio_id ORDER BY portfolio_id) as seqnum
FROM portfolio_images pi
) pi
ON pi.portfolio_id = p.id AND seqnum = 1;
РЕДАКТИРОВАТЬ:
В более старых версиях, если вам нужен только один столбец из portfolio_images
, вы можете использовать коррелированный подзапрос:
select p.*,
(select pi.portfolio_images
from portfolio_images pi
where pi.portfolio_id = p.id
limit 1
) as portfolio_images
from portfolio p;
Что касается вашего запроса, DISTINCT
применяется к всем столбцам, поэтому очевидно, что разные столбцы имеют разные значения, даже если столбцы из portfolio
одинаковы.