Сложные 4 связанные таблицы MYSQL запрос

0

У меня сложный запрос на запись (по крайней мере, для меня). У меня есть 4 таблицы - ressources_department (ressource_record_id, account_id, department_id, active) - ressources_type_users (id, email, password) - ressources_records (id, ressource_main_id, ressource_id, account_id) - ressources_records_details (ressource_record_id, ressource_field_id, ressource_data)

  • ressource_department содержит пользователей (ressources_records) для определенного отдела и учетной записи.
  • ressource_type_users содержит основную информацию для пользователей (адрес электронной почты, пароль) и уникальный идентификатор.
  • ressource_records содержит уникальный идентификатор пользователя (ressource_main_id), а также ссылку на детали пользователя (ressources_records_details)
  • ressources_records_details содержит пользовательские данные. Ressource_fields (int) - тип ressource_date. Ex. : 113 - код для адреса электронной почты.

Мне нужно написать запрос, чтобы показать всю информацию вложенной.

То, что я сделал до сих пор:

SELECT a.ressource_record_id, a.account_id, a.active, a.department_id, b.ressource_main_id, b.ressource_id 
FROM ressources_department a 
join ressources_records b on a.ressource_record_id = b.id
WHERE a.active=1

Это дает мне почти то, что мне нужно, кроме данных "ressources_records_details". Я могу перебирать php и запрашивать базу данных для каждой строки, но я не думаю, что это путь.

Я старался:

SELECT a.ressource_record_id, a.account_id, a.active, a.department_id, b.ressource_main_id, b.ressource_id, max(if((c.ressource_type = 113),c.ressource_data,NULL)) AS email
FROM ressources_department a 
join ressources_records b on a.ressource_record_id = b.id
join ressources_records_details c on a.ressource_record_id = c.ressource_record_id 
group by c.ressource_record_id

Но некоторые записи отсутствуют... нужна помощь, я застрял. Спасибо!

ОБНОВЛЕНИЕ: Я получаю результаты, которые я хочу, с тоннами подзапросов, но это стоит много времени на сервере, не так ли?

SELECT a.ressource_record_id, a.account_id, a.active, a.department_id, b.ressource_main_id, b.ressource_id,
(select ressource_data from ressources_records_details where ressource_record_id=a.ressource_record_id and ressource_type=113) as email,
(select ressource_data from ressources_records_details where ressource_record_id=a.ressource_record_id and ressource_type=101) as lastname,
(select ressource_data from ressources_records_details where ressource_record_id=a.ressource_record_id and ressource_type=100) as firstname,
(select ressource_data from ressources_records_details where ressource_record_id=a.ressource_record_id and ressource_type=114) as address,
(select ressource_data from ressources_records_details where ressource_record_id=a.ressource_record_id and ressource_type=115) as zip,
(select ressource_data from ressources_records_details where ressource_record_id=a.ressource_record_id and ressource_type=116) as city
FROM ressources_department a 
join ressources_records b on a.ressource_record_id = b.id
  • 1
    обновите свой вопрос, добавьте правильный образец данных, ваш фактический результат и ожидаемый результат
  • 0
    Да. См. Meta.stackoverflow.com/questions/333952/…
Теги:

1 ответ

0

Вы можете сделать это без подзапросов с помощью операторов CASE:

SELECT rd.ressource_record_id, rd.account_id, rd.active, 
    rd.department_id, rr.ressource_main_id, rr.ressource_id,
CASE WHEN rrd.resource_type = 113 THEN ressource_data ELSE NULL END AS email,
CASE WHEN rrd.resource_type = 101 THEN ressource_data ELSE NULL END AS lastname,
CASE WHEN rrd.resource_type = 100 THEN ressource_data ELSE NULL END AS firstname,
CASE WHEN rrd.resource_type = 114 THEN ressource_data ELSE NULL END AS address,
CASE WHEN rrd.resource_type = 115 THEN ressource_data ELSE NULL END AS zip,
CASE WHEN rrd.resource_type = 116 THEN ressource_data ELSE NULL END AS city
FROM ressources_department rd 
JOIN ressources_records rr 
    ON rb.ressource_record_id = rr.id
JOIN ressources_records_details rrd 
    ON rrd.ressource_record_id = rd.ressource_record_id
GROUP BY rd.ressource_record_id, rd.account_id, 
    rd.active, rd.department_id, rr.ressource_main_id, rr.ressource_id

Ещё вопросы

Сообщество Overcoder
Наверх
Меню