Estás muy cerca. Debe unirse a su tabla clave/valor itemproperties
una vez por cada clave distinta (propiedad) que necesite recuperar. La cosa es que necesitas usar LEFT JOIN
. Interior liso JOIN
suprime la fila de salida cuando no se cumple el criterio de unión.
Prueba esto.
SELECT i.ID as ItemID, i.Name as ItemName,
p1.Value AS Color, p2.Value AS Speed, p3.Value AS Price
FROM items as i
LEFT JOIN itemproperties AS p1 ON (i.ID=p1.ItemID) AND (p1.Name = 'Color')
LEFT JOIN itemproperties AS p2 ON (i.ID=p2.ItemID) AND (p2.Name = 'Speed')
LEFT JOIN itemproperties AS p3 ON (i.ID=p3.ItemID) AND (p3.Name = 'Price')
Las expresiones seleccionando el Name
valores (z.B. p3.Name = 'Price'
) entra en tu ON
cláusula en lugar de su WHERE
cláusula.