SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 04.04.2017 11:49:30

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

Как выполнить сцепку из двух таблиц?

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

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


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

-- Дамп структуры для таблица 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 */;
 

Отредактированно sql157 (05.04.2017 13:45:01)


Прикрепленные файлы:
Attachment Icon 01.jpg, Размер: 248,622 байт, Скачано: 385

Неактивен

 

#2 04.04.2017 11:57:03

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

Re: Как выполнить сцепку из двух таблиц?

Неактивен

 

#3 04.04.2017 12:38:58

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

Re: Как выполнить сцепку из двух таблиц?

vasya написал:

https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat

Прошу прощения, но всё равно не понимаю...

Запрос 1

SELECT concat_ws(' ',name_stud, pol_stud, vozrast_stud) as scep_stud_xar FROM tst_008_03_stud
 

выводит
"name stud 1 m 20"

Запрос 2
SELECT `t01`.`id_group`, GROUP_CONCAT(DISTINCT`t02`.`name_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`


Выводит
"id_group"    "scepk_name_stud"
"1"            "name stud 1 ,  name stud 2 ,  name stud 3"
"2"            "name stud 4 ,  name stud 5 ,  name stud 6"
"3"            "name stud 7 ,  name stud 8 ,  name stud 9"
"4"            "name stud 10 ,  name stud 11 ,  name stud 12"
"5"            "name stud 13 ,  name stud 14 ,  name stud 15"
"6"            "name stud 16 ,  name stud 17 ,  name stud 18"
"7"            "name stud 19 ,  name stud 20 ,  name stud 21"
"8"            "name stud 22 ,  name stud 23 ,  name stud 24"
"9"            "name stud 25 ,  name stud 26 ,  name stud 27"


А как сделать как в ТС не понимаю?

id_group    scepka 1
1           institut fak 1.group 1 (name stud 1 m 20, name stud 2 g 21, name stud 3 m 22)

Отредактированно sql157 (04.04.2017 12:39:17)

Неактивен

 

#4 04.04.2017 12:47:56

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

Re: Как выполнить сцепку из двух таблиц?

зачем left join? могут быть группы без студентов?

GROUP_CONCAT(concat_ws(' ',t02.name_stud, t02.pol_stud, t02.vozrast_stud) ORDER BY `t02`.`name_stud` ASC SEPARATOR ' ,  ')

Неактивен

 

#5 04.04.2017 13:39:18

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

Re: Как выполнить сцепку из двух таблиц?

Сделал так
Запрос 3

SELECT `t01`.`id_group`,
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`
 


Результат
"id_group"scepk_name_stud"   
'1', 'name stud 1 m 20 ,  name stud 2 g 21 ,  name stud 3 m 22'
'2', 'name stud 4 g 23 ,  name stud 5 m 24 ,  name stud 6 g 25'
'3', 'name stud 7 m 26 ,  name stud 8 g 27 ,  name stud 9 m 28'
'4', 'name stud 10 g 29 ,  name stud 11 m 30 ,  name stud 12 g 31'
'5', 'name stud 13 m 32 ,  name stud 14 g 33 ,  name stud 15 m 34'
'6', 'name stud 16 g 35 ,  name stud 17 m 36 ,  name stud 18 g 37'
'7', 'name stud 19 m 38 ,  name stud 20 g 39 ,  name stud 21 m 40'
'8', 'name stud 22 g 41 ,  name stud 23 m 42 ,  name stud 24 g 43'
'9', 'name stud 25 m 44 ,  name stud 26 g 45 ,  name stud 27 m 46'


vasya написал:

зачем left join?

Не помню... Плохо ориентируюсь пока в этом вопросе...
Когда-то долго не срабатывал запрос.. Потом случайно сработал с left join..
До полноценного изучения теории по join пока не добрался...

vasya написал:

могут быть группы без студентов?

Нет. Точно нет.

Если у вас есть возможность, не могли бы вы подсказать как довести до уровня..
id_group    scepka 1
1           institut fak 1.group 1 (name stud 1 m 20, name stud 2 g 21, name stud 3 m 22)

?
Слово "institut" предполагается использовать как текстовая вставка в запросе, а не как данные из поля таблицы.

Неактивен

 

#6 04.04.2017 17:49:41

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

Re: Как выполнить сцепку из двух таблиц?

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`;


про join см http://sqlinfo.ru/forum/viewtopic.php?id=3210

Неактивен

 

#7 05.04.2017 12:13:10

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

Re: Как выполнить сцепку из двух таблиц?

vasya написал:

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`;


про join см http://sqlinfo.ru/forum/viewtopic.php?id=3210

Всё понял.. Всё работает...
Спасибо...

Вопрос
Можно ли сделать, чтобы выборка из ТС  "institut fak 1.group 1 (name stud 1 m 20, name stud 2 g 21, name stud 3 m 22)"
в таблице "tst_008_02_group" формировалась в отдельно вычисляемом поле?
Причём чтобы "tst_008_02_group" была именно таблица с возможностью добавлять и удалять записи
В общем, что-то типа Ексель..

Может бестолковый вопрос.... пока осваиваю... поэтому прошу извинить...

Неактивен

 

#8 05.04.2017 12:19:38

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

Re: Как выполнить сцепку из двух таблиц?

Генерируемые колонки
или с помощью триггера вычисляйте

Неактивен

 

#9 05.04.2017 12:38:04

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

Re: Как выполнить сцепку из двух таблиц?

vasya написал:

Вопрос
Можно ли сделать, чтобы в запросе из сообщения #6 поле id_group было проиндексировано?

Для наглядности прилагаю результат запроса
id_group |scepk_name_stud                                                                      |
---------|-------------------------------------------------------------------------------------|
1        |institut fak 1.group 1 (name stud 1 m 20 ,  name stud 2 g 21 ,  name stud 3 m 22)    |
2        |institut fak 2.group 2 (name stud 4 g 23 ,  name stud 5 m 24 ,  name stud 6 g 25)    |
3        |institut fak 3.group 3 (name stud 7 m 26 ,  name stud 8 g 27 ,  name stud 9 m 28)    |
4        |institut fak 1.group 4 (name stud 10 g 29 ,  name stud 11 m 30 ,  name stud 12 g 31) |
5        |institut fak 2.group 5 (name stud 13 m 32 ,  name stud 14 g 33 ,  name stud 15 m 34) |
6        |institut fak 3.group 6 (name stud 16 g 35 ,  name stud 17 m 36 ,  name stud 18 g 37) |
7        |institut fak 1.group 7 (name stud 19 m 38 ,  name stud 20 g 39 ,  name stud 21 m 40) |
8        |institut fak 2.group 8 (name stud 22 g 41 ,  name stud 23 m 42 ,  name stud 24 g 43) |
9        |institut fak 3.group 9 (name stud 25 m 44 ,  name stud 26 g 45 ,  name stud 27 m 46) |

Неактивен

 

#10 05.04.2017 12:40:30

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

Re: Как выполнить сцепку из двух таблиц?

что вы подразумеваете под индексом в запросе?
индекс может быть у таблицы

Неактивен

 

#11 05.04.2017 12:59:16

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

Re: Как выполнить сцепку из двух таблиц?

vasya написал:

что вы подразумеваете под индексом в запросе?
индекс может быть у таблицы

Понял....
Плаваю в терминах...

В моём случае Таблицы MYSql подключаю к Аксес.
Таблицы связаны отношением 1:М через формы Аксес.

MYSql таблицы связать пока не пробовал...

Так вот...
Если ID в таблицах не проиндексированы, то в Аксес таблицы открываются с жуткими тормозами..
После индексации (см. пример), если в последней таблице ( в случае ТС это таблица "tst_008_03_stud" ) 13 полей 1,0 млн записей, то в Аксес всё "летает".

Пример.
Индексация id в последней таблице

   
        PRIMARY KEY (`id_stud`),
    INDEX `id_group` (`id_group`),
    INDEX `id_fak` (`id_fak`)


Ну да ладно... Суть понял....
Ответ: индексировать поле можно только в таблице...

Неактивен

 

Board footer

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