Rose debug info
---------------

MySQL шпаргалка

Создаем пользователя, прописываем в нужной базе привилегии для пользователя, удаляем пользователя.

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';
FLUSH PRIVILEGES;

DROP USER 'demo'@'localhost';

Множественное объединение в запросе.
Есть одна таблица Записи

Индекс Дата Место Исполнитель1 Исполнитель2
1 01.02.2003 Совхоз им. Ленина 1 2

И вторая таблица с исполнителями
Исполнители

Индекс Имя
1 Иванов Иван Иванович
2 Петров Петр Петрович

нам нужно вывести в запросе все имена вместе с датой и местом

Запрос будет таков:

SELECT Дата, Место, Исп1.Имя, Исп2.Имя FROM Записи
#Здесь в селекте используются псевдонимы, 
# которые будут определяться позже в запросе, что вызывает путаницу поначалу
LEFT JOIN Исполнители AS Исп1 ON Записи.Исполнитель1 = Исп1.Индекс
LEFT JOIN Исполнители AS Исп1 ON Записи.Исполнитель2 = Исп2.Индекс
# В left join мы задали те самые алиасы (псевдонимы)

Условие совпадения не обязательно могут быть по индексу.
Будут выведены все записи, если исполнителя нет, то будет выведено NULL

Сам пример не случайный, именно так была устроена база ГРЦРФ. Ошибка здесь в том, что у одной записи строго ограниченное количество исполнителей жестко прошитое в структуре, то же самое было и относительно участников сеанса записи со стороны экспедиции. Правильным решением является соединение через еще одну промежуточную таблицу. Это называется «реляционное деление». В промежуточной таблице указывается id записи в основной таблице «Записи» и id в записи «Исполнители». Соответственно запрос ищет сначала все записи в промежуточной таблице с id потом считывает из поискового запроса все id исполнителей и после этого их подставляет в финальную выдачу.
Примера пока нет. Возможно когда-то будет updated.

Поделиться
Отправить
 250   2021   web
Ctrl ←about