динамические строки mysql - PullRequest
       15

динамические строки mysql

0 голосов
/ 24 сентября 2011

каждый я хотел бы выполнить запрос на MySQL с динамическими строками.

Представьте себе это:

настольные телефоны_категории

+----+------------+
| id | name       |
+----+------------+
|  1 | Home Phone |
|  2 | Cell Phone | 
|  3 | Fax        | 
+----+------------+

настольные телефоны

+----+-----------+-------------------+--------------+
| id | entity_id | phone_category_id | phone_number |
+----+-----------+-------------------+--------------+
|  1 |         1 |                 1 | X19 XXX 2XX  |
|  2 |         1 |                 3 | X19 XXX 2XX  |
|  3 |         2 |                 1 | X18 XXX 4XX  |
|  4 |         2 |                 3 | X18 XXX 4XX  |
+----+-----------+-------------------+--------------+

Я хотел бы получить следующий вывод:

+-----------+--------------+--------------+-------------+
| entity_id | Home Phone   | Cell Phone   | Fax         |
+-----------+--------------+--------------+-------------+
|         1 |  X19 XXX 2XX |              | X19 XXX 2XX |             
|         2 |  X18 XXX 4XX |              | X18 XXX 4XX |
+-----------+--------------+--------------+-------------+

Хорошо, мне нужна некоторая «динамика», потому что в будущем таблица phone_categories может расти.

1 Ответ

1 голос
/ 24 сентября 2011

Это называется "сводной таблицей" или "запросом кросс-таблицы". 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`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...