I like tordek's answer the best, but here is a sloppy example of how to use group_concat in mysql to pull off similar matching.
The advantage of this is that you don't have to change it too much (other than altering the having) if you need to match MORE types later. The downside of course is that you cannot index the pseudo-column inthe select, which may or may not make a difference depending on your application.
You can also create the entire query (minus the having) as a view
and then perform a select on it anytime you need. The view will not be writable, but if it fits your needs, yay! Then filter it using WHERE type LIKE...etc ;)
SELECT DISTINCT id, CONCAT( " ", GROUP_CONCAT( type SEPARATOR " " ), " " ) as type
FROM table
GROUP BY id
HAVING type LIKE "% 1 %" AND type LIKE "% 2 %" AND type LIKE "% 3 %"
Wrap this in another subselect like so to get just the id.
SELECT id
FROM(
SELECT DISTINCT id, CONCAT( " ", GROUP_CONCAT( type SEPARATOR " " ), " " ) as type
FROM table
GROUP BY id
HAVING type LIKE "% 1 %" AND type LIKE "% 2 %" AND type LIKE "% 3 %"
) t