1 つのアプローチは、相関サブクエリを使用して各フィールド値を列として返すことです。
SELECT t.id
, (SELECT f1.value FROM mytable f1
WHERE f1.id = t.id AND f1.field_name = 'sign_up'
ORDER BY f1.value LIMIT 1
) AS SIGN_UP
, (SELECT f2.value FROM mytable f2
WHERE f2.id = t.id AND f2.field_name = 'first_name'
ORDER BY f2.value LIMIT 1
) AS FIRST_NAME
, (SELECT f3.value FROM mytable f3
WHERE f3.id = t.id AND f3.field_name = 'street'
ORDER BY f3.value LIMIT 1
) AS STREET
FROM (SELECT s.id
FROM mytable s
GROUP BY s.id
ORDER BY s.id
) t
これが唯一の方法ではありませんが、特に、正確に 4 つの列が返されること、およびそれらが特定の順序で返されることを懸念している場合は、実行可能なアプローチです。
このアプローチは、特定の ID に対して特定の field_name が「欠落」している場合に機能することに注意してください (値の代わりに NULL が返されます)。特定の ID に対して同じ field_name が複数回出現する場合にも機能します。(このクエリは、そのうちの 1 つだけを返し、もう 1 つを無視します。)
これと同じ結果セットは、次のように記述されたクエリでも取得できます。
SELECT t.id AS ID
, f1.sign_up AS SIGN_UP
, f2.first_name AS FIRST_NAME
, f3.street AS STREET
FROM (SELECT s.id
FROM mytable s
GROUP BY s.id
ORDER BY s.id
) t
LEFT
JOIN (SELECT s1.id
, MIN(s1.value) AS sign_up
FROM mytable s1
WHERE s1.field_name = 'sign_up'
AND s1.value IS NOT NULL
GROUP BY s1.id
) f1
ON f1.id = t.id
LEFT
JOIN (SELECT s2.id
, MIN(s2.value) AS first_name
FROM mytable s2
WHERE s2.field_name = 'first_name'
AND s2.value IS NOT NULL
GROUP BY s2.id
) f2
ON f2.id = t.id
LEFT
JOIN (SELECT s3.id
, MIN(s3.value) AS street
FROM mytable s3
WHERE s3.field_name = 'street'
AND s3.value IS NOT NULL
GROUP BY s3.id
) f3
ON f3.id = t.id
他のクエリではfield_name
、特定の ID に対して a が「欠落」している場合、特定の ID に重複がある場合field_name
、またはテーブルに関係のない追加の field_name 値がある場合に、目的の動作が得られることを確認してください。