SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 05.04.2017 13:49:56

sql157
Завсегдатай
Зарегистрирован: 17.03.2016
Сообщений: 97

Триггер для сцепки с грппуировкой

Имеется две таблицы
- tst_008_02_group - группы
- tst_008_03_stud - студенты.


Вопрос.
Как сделать сцепку триггером полей двух таблиц для каждой "group 1"  в отдельном поле "scepka" таблицы "tst_008_02_group" в формате "institut fak 1.group 1 (name stud 1 m 20, name stud 2 g 21, name stud 3 m 22)"?

Код

-- Дамп структуры для таблица 01tst.tst_008_02_group
CREATE TABLE IF NOT EXISTS `tst_008_02_group` (
  `id_fak` int(11) NOT NULL DEFAULT '0',
  `id_group` int(11) NOT NULL AUTO_INCREMENT,
  `fak_name` char(50) DEFAULT NULL,
  `group_name` char(50) DEFAULT NULL,
  PRIMARY KEY (`id_group`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

-- Дамп данных таблицы 01tst.tst_008_02_group: ~8 rows (приблизительно)
/*!40000 ALTER TABLE `tst_008_02_group` DISABLE KEYS */;
INSERT INTO `tst_008_02_group` (`id_fak`, `id_group`, `fak_name`, `group_name`) VALUES
    (1, 1, 'fak 1', 'group 1'),
    (1, 2, 'fak 2', 'group 2'),
    (1, 3, 'fak 3', 'group 3'),
    (2, 4, 'fak 1', 'group 4'),
    (2, 5, 'fak 2', 'group 5'),
    (2, 6, 'fak 3', 'group 6'),
    (3, 7, 'fak 1', 'group 7'),
    (3, 8, 'fak 2', 'group 8'),
    (3, 9, 'fak 3', 'group 9');
/*!40000 ALTER TABLE `tst_008_02_group` ENABLE KEYS */;

-- Дамп структуры для таблица 01tst.tst_008_03_stud
CREATE TABLE IF NOT EXISTS `tst_008_03_stud` (
  `id_fak` int(11) DEFAULT NULL,
  `id_group` int(11) DEFAULT NULL,
  `id_stud` int(11) NOT NULL AUTO_INCREMENT,
  `name_stud` char(50) DEFAULT NULL,
  `pol_stud` char(50) DEFAULT NULL,
  `vozrast_stud` int(11) DEFAULT NULL,
  PRIMARY KEY (`id_stud`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;

-- Дамп данных таблицы 01tst.tst_008_03_stud: ~27 rows (приблизительно)
/*!40000 ALTER TABLE `tst_008_03_stud` DISABLE KEYS */;
INSERT INTO `tst_008_03_stud` (`id_fak`, `id_group`, `id_stud`, `name_stud`, `pol_stud`, `vozrast_stud`) VALUES
    (1, 1, 1, 'name stud 1', 'm', 20),
    (1, 1, 2, 'name stud 2', 'g', 21),
    (1, 1, 3, 'name stud 3', 'm', 22),
    (1, 2, 4, 'name stud 4', 'g', 23),
    (1, 2, 5, 'name stud 5', 'm', 24),
    (1, 2, 6, 'name stud 6', 'g', 25),
    (1, 3, 7, 'name stud 7', 'm', 26),
    (1, 3, 8, 'name stud 8', 'g', 27),
    (1, 3, 9, 'name stud 9', 'm', 28),
    (2, 4, 10, 'name stud 10', 'g', 29),
    (2, 4, 11, 'name stud 11', 'm', 30),
    (2, 4, 12, 'name stud 12', 'g', 31),
    (2, 5, 13, 'name stud 13', 'm', 32),
    (2, 5, 14, 'name stud 14', 'g', 33),
    (2, 5, 15, 'name stud 15', 'm', 34),
    (2, 6, 16, 'name stud 16', 'g', 35),
    (2, 6, 17, 'name stud 17', 'm', 36),
    (2, 6, 18, 'name stud 18', 'g', 37),
    (3, 7, 19, 'name stud 19', 'm', 38),
    (3, 7, 20, 'name stud 20', 'g', 39),
    (3, 7, 21, 'name stud 21', 'm', 40),
    (3, 8, 22, 'name stud 22', 'g', 41),
    (3, 8, 23, 'name stud 23', 'm', 42),
    (3, 8, 24, 'name stud 24', 'g', 43),
    (3, 9, 25, 'name stud 25', 'm', 44),
    (3, 9, 26, 'name stud 26', 'g', 45),
    (3, 9, 27, 'name stud 27', 'm', 46);
/*!40000 ALTER TABLE `tst_008_03_stud` ENABLE KEYS */;

/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
 

Неактивен

 

#2 05.04.2017 14:51:03

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

Re: Триггер для сцепки с грппуировкой

у вас же есть запрос дающий нужный результат
собственно каждый триггер и будет состоять из одного запроса

Неактивен

 

#3 05.04.2017 18:26:23

sql157
Завсегдатай
Зарегистрирован: 17.03.2016
Сообщений: 97

Re: Триггер для сцепки с грппуировкой

vasya написал:

у вас же есть запрос дающий нужный результат
собственно каждый триггер и будет состоять из одного запроса

Триггер для таблицы "tst_008_02_group"
на обновление полей:
  - `fak_name`
  - `group_name`

BEGIN

  IF (NOT OLD.fak_name<=> NEW.fak_name)  
  or
  IF (NOT OLD.group_name<=> NEW.group_name)

    THEN  
    INSERT INTO tst_008_02_group(scepka)
 VALUES(
 SELECT `t01`.`id_group`,
concat('institut ', fak_name, ' ', group_name, ' (',
GROUP_CONCAT(
concat_ws
(' ',t02.name_stud, t02.pol_stud, t02.vozrast_stud)
ORDER BY `t02`.`name_stud`
ASC SEPARATOR ' ,  '), ')'
)

AS`scepk_name_stud`
FROM `tst_008_02_group` `t01`
LEFT JOIN `tst_008_03_stud` `t02` ON `t01`.`id_group` = `t02`.`id_group`
GROUP BY `t01`.`id_group`;
  END IF;
  END IF;
END



PS
Ещё раз прошу извинить...
Кусками понимаю, а как в одно целое собрать не пойму..
Буду признателен если у вас будет возможность рассмотреть триггер для данного ТС..

На правах бреда прикладываю "фантазии". См. выше

Неактивен

 

#4 05.04.2017 18:52:22

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

Re: Триггер для сцепки с грппуировкой

я тоже не понимаю, почему при обновлении нужно делать insert
распишите что должен делать триггер при добавлении, обновлении и удалении для каждой из таблиц
вот и получится у вас 5 триггеров

Неактивен

 

#5 05.04.2017 19:48:52

sql157
Завсегдатай
Зарегистрирован: 17.03.2016
Сообщений: 97

Re: Триггер для сцепки с грппуировкой

vasya написал:

я тоже не понимаю, почему при обновлении нужно делать insert
распишите что должен делать триггер при добавлении, обновлении и удалении для каждой из таблиц
вот и получится у вас 5 триггеров

Повторюсь, чтобы всё было в одном сообщение, для наглядности.

Требуется
Сделать триггером сцепку полей двух таблиц.
Сцепленные данные необходимо разместить в таблице "tst_008_02_group" в отдельном поле "scepka" для каждой записи таблицы.
Обращаю внимание: в ТС поле "scepka" в таблице "tst_008_02_group" отсутствует. Не заметил.. Потом добавил.
В результате сцепки должно получиться значение.
Пример.
"institut fak 1.group 1 (name stud 1 m 20, name stud 2 g 21, name stud 3 m 22)"
Слово "institut" должно быть прописано в триггере


1. Таблица: "ГРУППЫ". tst_008_02_group
Из таблицы извлекаются данные:
- fak n;
- group n;
Производится сцепка в выражение 1:
- "fak n.group n"
а дальше куда даже не знаю  ???

Триггеры:
   - Добавления - добавляет данные только для нужной записи и поля;
   - Обновления - обновляет данные только для нужной записи и поля;
   - Удаления - обновляет данные только для нужной записи и поля;

2. Таблица: "ГРУППЫ". tst_008_03_stud
Из таблицы извлекаются данные:
- name_stud n;
- m/g;
  - n;

Производится сцепка в выражение 2:
Пример
- "name stud 1 m 20, name stud 2 g 21, name stud 3 m 22)"

а дальше куда даже не знаю  ???

Триггеры:
   - Добавления - добавляет данные только для нужной записи и поля;
   - Обновления - обновляет данные только для нужной записи и поля;
   - Удаления - обновляет данные только для нужной записи и поля;

Рассуждения
Что-то после того как расписал, подумалось...
Состав-то триггеров будет:
1. Триггеры Таблицы: "ГРУППЫ". tst_008_02_group
Триггеры:
   - Добавления;
   - Обновления;
   - Удаления;

Триггеры отправляют данные в таблицу "tst_008_02_group" в предварительное поле
"scepka_fak_group"

2. Таблица: "ГРУППЫ". tst_008_03_stud
Триггеры:
   - Добавления;
   - Обновления;
   - Удаления;

Триггеры отправляют данные в таблицу "tst_008_02_group" в предварительное поле
"scepka_nameStud_polStud_vozrastStud"

3. Таблица: "ГРУППЫ". tst_008_02_group
Триггеры:
   - Добавления;
   - Обновления;
   - Удаления;
Триггеры отправляют данные в таблицу "tst_008_02_group" в поле
"scepka" = "institut" + "scepka_fak_group" + "scepka_nameStud_polStud_vozrastStud"

ИТОГО:
Триггеры - 9шт.


Вопрос.
1. Правильно ли я понимаю структуру триггеров?

Неактивен

 

#6 05.04.2017 20:00:06

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

Re: Триггер для сцепки с грппуировкой

зачем нужно предварительное поле "scepka_fak_group"?
у вас 2 таблицы и 3 действия
но в случае удаления строки в таблице групп триггер не нужен
итого 5 триггеров.

напишите сначала один триггер, например, на добавление строки в таблице групп
потом другие пойдут легче

Неактивен

 

Board footer

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