Это называется "сводной таблицей" или "запросом кросс-таблицы". MySQL один не может сделать это динамически. Вам всегда нужно знать имена столбцов заранее, поэтому, если вы используете язык программирования / сценариев для вывода, вы можете использовать его для динамического построения оператора SQL с циклом for
после определения категорий.
Но запрос будет выглядеть так:
SELECT
phones.entity_id,
CASE WHEN phones.phone_category_id = 1 THEN phones.phone_number ELSE NULL END AS `Home Phone`,
CASE WHEN phones.phone_category_id = 2 THEN phones.phone_number ELSE NULL END AS `Cell Phone`,
CASE WHEN phones.phone_category_id = 3 THEN phones.phone_number ELSE NULL END AS `Fax`
FROM phones
Вы не определили ни одного языка программирования, поэтому вот несколько псевдокодов для генерации запроса:
categories = "SELECT id, name FROM phone_categories;"
foreach categories
sql_columns = sql_columns + " CASE WHEN phones.phone_category_id = " + categories.id + " THEN phones.phone_number ELSE NULL END AS `categories.name`