1 (изменено: chem1, 2008-05-19 13:38:43)

Тема: Разбить строку таблицы на несколько частей

В строке таблицы mySQL большой массив данных (текст). Можно его как-нибуть разбить на несколько мелких частей? Частей должно быть много (больше сотни) поэтому вариант резрезать в ручную не предлагать.

Исходная строка таблицы: id (идентификатор - номер строки), page (пусто), text (400kb текста)

Должно получиться :  id (идентификатор - номер строки), page (1), text (первые 4kb текста)
                                 id (идентификатор - номер строки), page (2), text (вторые 4kb текста)
                                 id (идентификатор - номер строки), page (3), text (третие 4kb текста)
                                 и т.д.

2

Re: Разбить строку таблицы на несколько частей

P.S. В программировании дуб дубом, буду благодерен если в своем ответе вы это учтете smile

3

Re: Разбить строку таблицы на несколько частей

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

В получаемой таблице id будет константой из исходной таблицы, а page инкементальным целочисленным значением?

4

Re: Разбить строку таблицы на несколько частей

Это надо исходную таблицу перезаписать полученными разрезанными данными, или необходимо создать другую таблицу и вставить в нее?
Удобнее было бы перезаписать, но вобщем то не принципиально, можно и в новую таблицу запихать.

Текст можно только по количеству символов разрезать, но в этом случае слова будут разрезаны.
Устраивает

В получаемой таблице id будет константой из исходной таблицы, а page инкементальным целочисленным значением?
id - да, page - фактически это будет номер страницы (число), который затем будет выводиться на странице сайта ввиде пагинатора 1,2,3,4....105

5

Re: Разбить строку таблицы на несколько частей

Создайте процедуру proc с помощью данного запроса. При выполнении в phpMyAdmin, не забудьте поставить в поле разделителя две косые черты [//]. Измените имена процедуры и таблиц, чтобы они не задели существующие данные.

После вызова:
CALL proc(100);
в таблице done будут данные разрезанные по 100 символов. Значение параметра можно менять.

CREATE PROCEDURE `proc`(IN incr_param INT)
BEGIN
  DECLARE xtext text;
  DECLARE xid INT;
  DECLARE xlength INT;
  DECLARE xpos INT DEFAULT 1;

  SELECT `id`, `text`, CHAR_LENGTH(`text`) INTO xid, xtext, xlength
  FROM `table` WHERE `id` = 1;

  DROP TABLE IF EXISTS `done`;
  CREATE TABLE `done` (
    `id` tinyint(4) NOT NULL,
    `page` mediumint(8) unsigned NOT NULL auto_increment,
    `text` varchar(1000) NOT NULL,
    KEY `page` (`page`)
  ) ENGINE=MyISAM;

  loop1: LOOP
    INSERT INTO `done` (`id`, `text`) VALUES (xid, substring(xtext, xpos, incr_param));
    SET xpos = xpos + incr_param;
    IF xpos <= xlength THEN ITERATE loop1; END IF;
    LEAVE loop1;
  END LOOP loop1;

END

6

Re: Разбить строку таблицы на несколько частей

Спасибо!
Процедура создалась.

После вызова:
CALL proc(100);

А как вызов осуществить? Где его написать надо?

7

Re: Разбить строку таблицы на несколько частей

chem1
CALL - это обычный SQL запрос. Как обычно SELECT пишите, так и это.

8 (изменено: chem1, 2008-05-20 07:42:21)

Re: Разбить строку таблицы на несколько частей

Спасибо огромное!
Все сработало.
Получилось то, что я хотел!

9

Re: Разбить строку таблицы на несколько частей

стал разбираться, заметил

`text` varchar(1000) NOT NULL

тип varchar вы предлогаете использовать по каким причинам?
Просто я всегда для текстовых массивов использую тип text.
Для этого типа в phpMyAdmin более удобная форма для редактирования.
Как правильнее?

10

Re: Разбить строку таблицы на несколько частей

chem1
Если количество символов в поле более 255 и менее 65535, MySQL автоматически подставит тип text вместо varchar. При использовании varchar, просто не надо запоминать, сколько символов может содержать используемый тип. Использовать тип text для данных менее 256 символов - неразумно, а более 65535 он содержать не может. Выбор типа всегда зависит от задачи.