SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 30.03.2015 16:15:15

Sapta
Участник
Зарегистрирован: 30.03.2015
Сообщений: 7

Создание таблицы нового вида из старой

Добрый день!
Подскажите, пожалуйста, с достаточно простой задачкой...

Есть таблица следующего вида.

field_lable                 field_value    record_id
----------------------------------------------------
дата обращения        2015-01-01        3
фамилия                    Иванов           3
имя                            Иван             3
отчество                  Иванович          3
дата обращения       2015-02-01        4
фамилия                   Петров            4
имя                           Пётр              4
отчество                 Петрович           4
дата обращения                              5
фамилия                  Сергеев           5
имя                         Сергей             5
отчество                Сергеевич          5


Нужно из неё получить следующий вид:

фамилия        имя       отчество         id      дата обращения
----------------------------------------------------------------------
Иванов         Иван       Иванович       3        2015-01-01
Петров         Пётр        Петрович       4        2015-02-01

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

Заранее спасибо за ответ!

Неактивен

 

#2 30.03.2015 16:34:13

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Создание таблицы нового вида из старой

Неактивен

 

#3 31.03.2015 10:01:31

Sapta
Участник
Зарегистрирован: 30.03.2015
Сообщений: 7

Re: Создание таблицы нового вида из старой

Сделал транспонирование следующим образом:

SELECT
  record_id,
  MAX(IF(field_label = 'Фамилия', field_value, NULL)) AS fist_name,
  MAX(IF(field_label = 'Имя', field_value, NULL)) AS second_name,
  MAX(IF(field_label = 'Отчество', field_value, NULL)) AS third_name,
  MAX(IF(field_label = 'Дата обращения', field_value, NULL)) AS date_tr
FROM d_record_values
GROUP BY record_id
ORDER BY  `date_tr` ASC


Осталось только отбросить данные с пустыми значениями в поле "Дата обращения".

Неактивен

 

#4 31.03.2015 10:48:35

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Создание таблицы нового вида из старой

select * from (ваш запрос) as t where date_tr <> '';

Неактивен

 

#5 31.03.2015 10:53:21

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Создание таблицы нового вида из старой

Правильней будет так

SELECT * FROM (ваш запрос с ORDER BY NULL) AS t WHERE date_tr <> ''  ORDER BY  `date_tr` ASC;


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

Неактивен

 

#6 31.03.2015 15:40:33

Sapta
Участник
Зарегистрирован: 30.03.2015
Сообщений: 7

Re: Создание таблицы нового вида из старой

Работает. Спасибо.
Появился один нюанс.
При выводе в phpmyadmin всех записей (со значениями null) запрос выполняется очень быстро (9к записей за 0,003 +/- сек)
Теперь при выводе результатов итогового, последнего запроса (без null) его обработка занимает более 1,5 сек. И выводится сразу огромной портянкой (соответственно и отрисовывается очень долго), хотя ранее по умолчанию всегда использовался вывод по 30 записей на странице.

К сожалению, вариант с удалением сначала пустых дат не подойдёт, т.к. где-то может отсутствовать отчество (например) в поле field_value и вся запись даже с наличием даты окажется в пролёте. Критичным является именно наличие даты.

Ещё один вопрос.
Полученные данные нужно залить в новую пустую таблицу d_list_value через UPDATE. Подскажите, как можно использовать данный запрос в этом деле.
Поля новой таблицы: id(auto increment), record_id, first_name, second_name, third_name, date_tr

Имеет ли смысл заапдейдить не запариваясь сначала всеми записями (в том числе и с пустыми) и потом через delete удалить лишнее? Или же данный вариант будет хуже смотреться в плане производительности и вообще не комильфо?

Неактивен

 

#7 31.03.2015 15:48:13

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Создание таблицы нового вида из старой

Если запрос выполняется разово, то с производительностью можно не заморачиваться.

insert into `d_list_value` (record_id, first_name, second_name, third_name, date_tr)
SELECT * FROM (
SELECT
  record_id,
  MAX(IF(field_label = 'Фамилия', field_value, NULL)) AS fist_name,
  MAX(IF(field_label = 'Имя', field_value, NULL)) AS second_name,
  MAX(IF(field_label = 'Отчество', field_value, NULL)) AS third_name,
  MAX(IF(field_label = 'Дата обращения', field_value, NULL)) AS date_tr
FROM d_record_values
GROUP BY record_id ORDER BY NULL) AS t WHERE date_tr <> ''  ORDER BY  `date_tr` ASC;
 

Неактивен

 

#8 31.03.2015 16:09:24

Sapta
Участник
Зарегистрирован: 30.03.2015
Сообщений: 7

Re: Создание таблицы нового вида из старой

Vasya, есть необходимость в периодическом обновлении новой таблицы d_list_value. Подойдёт ли здесь оператор insert? Поэтому и спросил именно про оператор update и быстродействие.

Неактивен

 

#9 31.03.2015 16:19:30

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Создание таблицы нового вида из старой

"данные нужно залить в новую пустую таблицу" это однозначно insert.
Что вы подразумеваете под "периодическим обновлением новой таблицы"?

Вариант с последующим delete быстрее не будет.

Неактивен

 

#10 31.03.2015 16:41:27

Sapta
Участник
Зарегистрирован: 30.03.2015
Сообщений: 7

Re: Создание таблицы нового вида из старой

Обновлённые данные должны появляться раз в сутки.
При первичном вводе данных однозначно insert. Но в дальнейшем таблица будет уже заполнена. Встаёт вопрос, как её обновлять в последствии. Через update? Или удалять все данные и заново заполнять через insert?
Собственно, стоит ли думать об изящном update, если можно сделать в лоб через delete-insert.

Отредактированно Sapta (31.03.2015 16:47:17)

Неактивен

 

#11 31.03.2015 16:50:10

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Создание таблицы нового вида из старой

Зависит от того, что нужно.
Если добавить новые строки в заполненную таблицу, то insert
Если обновить уже существующие строки, то update

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

Неактивен

 

#12 31.03.2015 17:04:45

Sapta
Участник
Зарегистрирован: 30.03.2015
Сообщений: 7

Re: Создание таблицы нового вида из старой

Каждый раз нужна полная выборка из исходной таблицы. Количество записей в неё не статично: может как увеличиться, так и уменьшиться. Поэтому нужно будет обновлять все строки в любом случае.

Неактивен

 

#13 31.03.2015 17:10:35

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Создание таблицы нового вида из старой

Тогда truncate/delete, затем insert

Неактивен

 

#14 01.04.2015 08:03:26

Sapta
Участник
Зарегистрирован: 30.03.2015
Сообщений: 7

Re: Создание таблицы нового вида из старой

Хорошо.
Спасибо за помощь!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson