MySQL запрос на возврат пользовательской структуры со значениями в качестве типа поля и заголовков - PullRequest
1 голос
/ 10 марта 2012

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

У меня есть таблица сэта структура:

id (INT)
idItem (INT)
fieldTitle (VARCHAR)
field (VARCHAR)
value_label (VARCHAR)
value_text (TEXT)
value_bool (TINYINT)
value_int (INT)
value_float (FLOAT)

Пример данных внутри таблицы:

id  idItem  fieldTitle  field       value_label     value_text              value_bool  value_int   value_float
--------------------------------------------------------------------------------------------------------------
1   15      title       value_label My Product One  NULL                    NULL        NULL        NULL
2   15      description value_text  NULL            Very good product...    NULL        NULL        NULL
3   15      visible     value_bool  NULL            NULL                    1           NULL        NULL
4   15      price       value_float NULL            NULL                    NULL        NULL        19.9
5   16      title       value_label My Product Two  NULL                    NULL        NULL        NULL
6   16      description value_text  NULL            Just an hidden product. NULL        NULL        NULL
7   16      visible     value_bool  NULL            NULL                    0           NULL        NULL
8   16      price       value_float NULL            NULL                    NULL        NULL        30

Я хочу закончить что-то вроде этого:

idItem (INT)
title  (VARCHAR)
description (TEXT)
visible (TINYINT)
price (FLOAT)

ПримерВыходные данные:

idItem  title           description             visible price
15      My Product One  Very good product...    1       19.9
16      My Product Two  Just an hidden product. 0       30

Ответы [ 2 ]

0 голосов
/ 10 марта 2012

Во-первых, я согласен с мнением Майкла и Мости. Почему вы предпочитаете иметь общую таблицу для хранения всех данных, а не конкретные таблицы? Структура таблицы, подобная приведенной ниже, обеспечит лучшую организацию ваших данных и упрощение запросов.

id INT
title VARCHAR(255)
description TEXT
visible TINYINT
price DECIMAL(5,2)

Во-вторых, при условии, что вы работаете со своей структурой, приведенный ниже запрос может помочь в получении данных:

SELECT `t`.`idItem`, `t`.`value_label` AS `title`, `t1`.`value_text` AS `description`, `t2`.`value_bool` AS `visible`, `t3`.`value_float` AS `price`
FROM `your_table` `t`
INNER JOIN `your_table` `t1` ON `t`.`idItem` = `t1`.`idItem` AND `t1`.`fieldTitle` = 'description'
INNER JOIN `your_table` `t2` ON `t`.`idItem` = `t2`.`idItem` AND `t2`.`fieldTitle` = 'visible'
INNER JOIN `your_table` `t3` ON `t`.`idItem` = `t3`.`idItem` AND `t3`.`fieldTitle` = 'price'
WHERE `t`.`fieldTitle` = 'title';

Надеюсь, это поможет.

0 голосов
/ 10 марта 2012

Хотя я не согласен с такими схемами (см. Мой комментарий под вашим вопросом), вы можете попробовать:

select idItem,
  max(if(fieldTitle = 'title', value_label, null)) Title,
  max(if(fieldTitle = 'description', value_text, null)) Description,
  max(if(fieldTitle = 'visible', value_bool, null)) Visible,
  max(if(fieldTitle = 'price', value_float, null)) Price
from t
group by idItem

В результате:

+--------+----------------+-------------------------+---------+-------+
| IDITEM |     TITLE      |       DESCRIPTION       | VISIBLE | PRICE |
+--------+----------------+-------------------------+---------+-------+
|     15 | My_Product_One | Very_good_product...    |       1 | 19.9  |
|     16 | My_Product_Two | Just_an_hidden_product. |       0 | 30    |
+--------+----------------+-------------------------+---------+-------+

Добавление дополнительных полей прямо вперед.Дайте мне знать, если у вас есть какие-либо проблемы с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...