You can use CASE
if there are limited meta_keys
SELECT a.*,b.Meta_id, b.post_id,
CASE WHEN b.meta_key ='mk1' THEN b.meta_value END `mk1`,
CASE WHEN b.meta_key ='mk2' THEN b.meta_value END `mk2`,
CASE WHEN b.meta_key ='mk3' THEN b.meta_value END `mk3`
FROM wp_posts a
JOIN wp_postmeta b ON( a.ID = b.post_id )
WHERE a.post_status = 'publish'
AND a.post_type='wpsc-product'
AND b.meta_key IN('mk1','mk2','mk3')
Edit for duplicates issue you can use JOINs
SELECT p.*,
a.Meta_id,
a.post_id,
a.meta_value mk1,
b.meta_value mk2,
c.meta_value mk3
FROM wp_posts p
LEFT JOIN wp_postmeta a ON(p.ID =a.post_id)
JOIN wp_postmeta b USING(post_id) /* is equal to ON(b.post_id = a.post_id) */
JOIN wp_postmeta c USING(post_id)
WHERE a.meta_key = 'mk1'
AND b.meta_key = 'mk2'
AND c.meta_key='mk3'