#mysql #ruby-on-rails
#mysql #ruby-on-rails
Вопрос:
Having 5 tables
Table a_dates = id,
Table b_types = id, a_date_id, c_type_id,
Table c_types = id, name,
Table d_profiles = id, name, profile_type
Table e_ps = id, a_date_id, d_profile_id
Из a_dates нужно получить b_types, … затем из b_types нужно c_types name,… Затем сравните имя c_types с именем d_profiles и получите идентификатор d_profiles …. если равно, то создайте записи в e_ps с идентификатором a_date_id, d_profile_id.
Не мог бы кто-нибудь, пожалуйста, помочь мне в получении запроса из inner join.
Я пробовал вроде, это неполный запрос
INSERT INTO e_ps(id,a_date_id,a_date_type,d_profile_id,c_id)
SELECT '',a.id,'A',dp.id,'67' FROM d_profiles dp
INNER JOIN a_dates a ON {HERE I NEED NAME MATCHING WITH c_types name} = dp.name and dp.profile_type = 'A'
INNER JOIN a_dates ON a.id = a_dates.id
LEFT OUTER JOIN e_ps eps ON eps.a_date_type = 'A' AND eps.a_date_id = a_dates.id
WHERE eps.a_date_id IS NULL
Комментарии:
1. смотрите: mysqltutorial.org/mysql-inner-join.aspx Это поможет вам.
Ответ №1:
Это кажется относительно простым объединением:-
INSERT INTO e_ps(id, a_date_id, d_profile_id)
SELECT NULL, a_dates.id, d_profiles.id
FROM a_dates
INNER JOIN b_types ON a_dates.id = b_types.a_date_id
INNER JOIN c_types ON b.c_type_id = c.id
INNER JOIN d_profiles ON c_types.name = d_profiles.name
С объединениями существует несколько типов, и я подозреваю, что вы запутались. Кратко:-
- С помощью ВНУТРЕННЕГО СОЕДИНЕНИЯ выполняется поиск соответствия, которое есть в ОБЕИХ таблицах. Если совпадений нет, возвращается запись no.
- С помощью ВНЕШНЕГО СОЕДИНЕНИЯ СЛЕВА он берет запись из таблицы слева и ищет соответствие в таблице справа. Если совпадение отличное, но если нет, то оно все равно возвращает строку обратно, но столбцы из таблицы справа просто имеют значения NULL.
- ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ почти такое же, только с перевернутыми таблицами (большинство людей, включая меня, избегают использовать это, поскольку в большинстве случаев это не имеет преимуществ, а просто все запутывает).
- При полном ВНЕШНЕМ СОЕДИНЕНИИ он получает записи с обеих сторон, независимо от того, совпадают они или нет. Если они совпадают, то возвращаются столбцы из обеих таблиц, если не совпадают, то возвращаются столбцы из одной. Не то чтобы MySQL не поддерживал ПОЛНОЕ ВНЕШНЕЕ ОБЪЕДИНЕНИЕ (хотя есть способы его эмуляции).
- ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ объединяет каждую комбинацию из 2 таблиц. Они используются, когда нет общего столбца для сопоставления, но вы хотите использовать все комбинации. Например, если вам нужна таблица всех сотрудников и всех дней недели для каждого сотрудника, вы бы перекрестно объединили таблицу дней недели с таблицей сотрудников (тогда для получения полезных данных вы могли бы ОСТАВИТЬ ВНЕШНЕЕ ОБЪЕДИНЕНИЕ таблицы праздников с результатом).
Комментарии:
1. Привет, спасибо Kickstart за ваше объяснение. Это сработало отлично 🙂