Since the primary key key is ID, Type
you can use aggregate functions and ensure the query is still deterministic, reducing the query to 0 joins:
SELECT a.ID,
MAX(CASE WHEN a.type = 'First Name' THEN a.Data END) AS FirstName,
MAX(CASE WHEN a.type = 'Last Name' THEN a.Data END) AS LastName,
MAX(CASE WHEN a.type = 'Timestamp' THEN a.Data END) AS `Timestamp`,
MAX(CASE WHEN a.type = 'Count' THEN a.Data END) AS `Count`,
MAX(CASE WHEN a.type = 'MY_ID' THEN a.Data END) AS MY_ID,
MAX(CASE WHEN a.Type = 'Foreign Id' THEN a.Data END) AS ForeignId
FROM Attributes a
GROUP BY a.ID;
It is worth noting though that the Entity-Attribute-Value Model is an SQL Antipattern, and you could be much better off normalising your data to store the attributes as columns, rather than having to use the above query to turn rows into columns.
EDIT
To add a filter based on an attribute use the HAVING
clause:
SELECT a.ID,
MAX(CASE WHEN a.type = 'First Name' THEN a.Data END) AS FirstName,
MAX(CASE WHEN a.type = 'Last Name' THEN a.Data END) AS LastName,
MAX(CASE WHEN a.type = 'Timestamp' THEN a.Data END) AS `Timestamp`,
MAX(CASE WHEN a.type = 'Count' THEN a.Data END) AS `Count`,
MAX(CASE WHEN a.type = 'MY_ID' THEN a.Data END) AS MY_ID,
MAX(CASE WHEN a.Type = 'Foreign Id' THEN a.Data END) AS ForeignId
FROM Attributes a
GROUP BY a.ID
HAVING MAX(CASE WHEN a.type = 'MY_ID' THEN a.Data END) = 1;