Как я могу присоединиться к мета-таблице с парами ключ-значение в качестве строки родителя - PullRequest
1 голос
/ 07 апреля 2019

Привет, у меня есть эта структура таблицы

form_submissions

+------+----------------------------------+
| id   | form_id                          |
+------+----------------------------------+
| 3812 | 00184e51e26a41e4a197035b62a1e07a |
| 3815 | 00184e51e26a41e4a197035b62a1e07a |
+------+----------------------------------+

form_submission_datas

+--------+--------------------+-----------+----------------+
| id     | form_submission_id | key       | value          |
+--------+--------------------+-----------+----------------+
| 534670 |              65952 | ip        | 192.168.255.10 |
| 534669 |              65952 | email     | NULL           |
| 534668 |              65952 | city      | NULL           |
| 534667 |              65952 | phone     | 123-123-1234   |
| 534666 |              65952 | full_name | גל             |
+--------+--------------------+-----------+----------------+

Мой целевой результат примерно такой

+--------------------+----------------+-------+------+--------------+-----------+
| form_submission_id | ip             | email | city | phone        | full_name |
+--------------------+----------------+-------+------+--------------+-----------+
|              65952 | 192.168.255.10 | NULL  | NULL | 123-123-1234 | gal       |
+--------------------+----------------+-------+------+--------------+-----------+

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

сейчас я делаю это на PHP, но у меня есть формы с 5-7k + строками, и это действительно не должностное лицо, каждая загрузка страницы занимает 60-70 секунд и занимает более 2 ГБ памяти Я бы хотел, чтобы MySQL сделал это для меня.

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Для структуры значения ключа вы можете использовать соединение для каждой пары значений ключа

  select  a.form_submission_id, a.ip
    , b.value as email
    , c.value as city
    , d.value as phone 
    , e.value as full_name
  from  form_submission_datas a 
  inner join  form_submission_datas b  = a.form_submission_id = b.form_submission_id 
    AND b.key = 'email'
  inner join  form_submission_datas c  = a.form_submission_id = c.form_submission_id 
    AND c.key = 'city'
  inner join  form_submission_datas d  = a.form_submission_id = d.form_submission_id 
    AND d.key = 'phone'
  inner join  form_submission_datas e  = a.form_submission_id = e.form_submission_id 
    AND e.key = 'full_name'
  where a.key ='ip' 
  and form_submission_id = 65952
0 голосов
/ 07 апреля 2019

Вы можете использовать условное агрегирование :

SELECT
    form_submission_id,
    MAX(CASE WHEN key = 'ip' THEN value END) ip,
    MAX(CASE WHEN key = 'email' THEN value END) email,
    MAX(CASE WHEN key = 'city' THEN value END) city,
    MAX(CASE WHEN key = 'phone' THEN value END) phone,
    MAX(CASE WHEN key = 'full_name' THEN value END) full_name
FROM form_submission_datas
GROUP BY form_submission_id

Для этого необходимо заранее знать список ключей, которые могут существовать в таблице; это связано с тем, что SQL-запрос должен возвращать фиксированный набор столбцов. Чтобы сделать это динамическим, вам нужно будет использовать динамический SQL , что, вероятно, выходит за рамки вашего вопроса.

NB. Для получения ожидаемого результата вам не нужна таблица представлений. Если вам нужно также восстановить некоторую информацию из этой таблицы, вам нужно будет добавить в запрос простое JOIN.

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