MySQL — Как преобразовать NVP?

#mysql #sql #pivot

#mysql #sql #сводить

Вопрос:

Допустим, у меня есть product_attribute таблица со следующими строками:

 ================================================================
| product_attribute_id | product_id | name         | value     |
================================================================
| 1                    | 25         | Author       | John Doe  |
----------------------------------------------------------------
| 2                    | 25         | Author       | Jane Doe  |
----------------------------------------------------------------
| 3                    | 55         | Publisher    | ABC Corp  |
----------------------------------------------------------------
| 4                    | 55         | Release Date | 20100125  |
----------------------------------------------------------------
  

Я изучаю возможность реализации Solr для полнотекстового поиска, и я думаю, что эта таблица потенциально содержит важную информацию, которую следует проиндексировать. Итак, я думаю, что эту таблицу нужно повернуть (используя product_id в качестве точки поворота), чтобы я мог объединить ее с другими таблицами, которые содержат информацию, которая должна быть проиндексирована.

Вопросы:

  1. Как мне преобразовать это в MySQL?
  2. Я не знаю заранее, какими будут все пары имя / значение. Будет ли это проблемой?
  3. Некоторые атрибуты имеют идентичные имена (например, «Автор» в примере выше). Будет ли это проблемой?

Ответ №1:

это довольно стандартная реализация

 SELECT
product_id,
GROUP_CONCAT(if(name = 'Author', value, NULL)) AS 'Author',
GROUP_CONCAT(if(name = 'Publisher', value, NULL)) AS 'Publisher',
FROM product_attribute
GROUP BY product_id; 
  

вы должны

 select distinct(name) from product_attribute
  

итак, вы можете создать приведенный выше запрос
но НЕТ, это не будет работать с идентичными именами, GROUP_CONCAT объединит значения .

я видел реализацию, которая добавляет столбец и заполняет его значениями приращения, чтобы затем можно было преобразовать таблицу с помощью переменных и счетчика. но у меня этого нет в mysql