Проблема с извлечением данных по группам по Mysql для нескольких таблиц - PullRequest
2 голосов
/ 11 июня 2019

В настоящее время у нас есть три таблицы

пользователей (используется для хранения основной информации)

  • id -> PK
  • имя-> Индекс
  • фамилия -> Индекс

И у нас есть еще много полей в этой таблице, обычно используемых для фильтрации данных


user_titles (которая является таблицей отношений «один ко многим» с Таблицей А. Что мы обычно используем для хранения заголовков пользователей в таблице А. У одного пользователя может быть несколько заголовков, из которых один может быть первичным, а другой - вторичным)

  • id
  • user_id (от FK до таблицы A)
  • title_id (от FK до таблицы заголовков, в которой мы храним все названия заголовков)
  • is_primary (enum -> 'primary', 'primary')

user_speciality (Таблица - это отношение один ко многим с таблицей пользователя, в которой мы храним основнойспециальность и дополнительная специальность пользователей)

  • id -> PK
  • user_id -> (FK, ссылка натаблица пользователей)
  • specialty_id -> (FK, ссылка на таблицу специальностей, в которой мы храним информацию о специальностях)
  • is_primary -> (enum -> 'primary', 'primary')

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

На основе этой структуры таблицы мы выбираем данные, как показано ниже: запрос

> SELECT `user_titles`.`title_id`,`user_titles`.`is_primary`,`user_speciality`.`speciality_id`,`user_speciality`.`is_primary`,`users`.`firstname`,`users`.`lastname`FROM `users`, `user_titles`,`user_speciality` where `user_speciality`.`user_id`=`users`.`id` and `user_titles`.`user_id`=`users`.`id`

Но когда мы перечисляем данные, мы получаем несколько строк для пользователей, если у пользователей есть дополнительные названия или специальности.В основном мне нужно, чтобы данные были в формате ниже.

Когда мы используем group_concat, приведенный выше запрос вызывает ошибку, которая говорит, что group_concat или group by невозможны.

user_id, title_id(primary), title_ids(secondary titles with comma seperated), user.firstname, user.lastname, speciality_id(primary), specialty_id(secondary id's with comma separated)

Мы могли бы легко получить эту структуру, если бы мы сохраняли названия и идентификаторы специальностей в таблице пользователей со значениями, разделенными запятыми, и записывали подобный запрос, но у нас огромный объем данных и сомнительная производительностькак запрос на эти кучу данных.

Пожалуйста, помогите нам решить проблему.

1 Ответ

2 голосов
/ 11 июня 2019

Никогда не используйте запятые в предложении FROM. Всегда используйте правильный, явный, стандартный JOIN синтаксис.

Тем не менее, вы хотите агрегировать.В частности, вы можете делать то, что хотите, с помощью условного агрегирования:

SELECT u.*,
       MAX(CASE WHEN ut.is_primary THEN ut.title_id END) as primary_title,
       GROUP_CONCAT(DISTINCT CASE WHEN NOT ut.is_primary THEN ut.title_id END) as secondary_titles,
       MAX(CASE WHEN us.is_primary THEN us.speciality_id END) as primary_specialty,
       GROUP_CONCAT(DISTINCT CASE WHEN NOT us.is_primary THEN us.speciality_id END) as secondary_specialties
FROM `users` u LEFT JOIN
     `user_titles` ut
     ON ut.user_id = u.id LEFT JOIN
     `user_speciality` us
     ON us.`user_id`= u.`id` 
GROUP BY u.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...