Заполнить / объединить несколько таблиц из многих в многие таблицы отношений в MySQL - PullRequest
2 голосов
/ 14 марта 2019

Этот вопрос нужно было задавать раньше, но мне трудно его найти. У меня есть таблица users, allergies, dietaries. пользователи могут иметь несколько аллергий и несколько диет. Для этого у меня есть таблица user_allergies, user_dietaries, в которой хранится внешний ключ обеих таблиц.

Теперь я хочу показать список пользователей с соответствующими им аллергиями, названиями диет. Я попытался с левым соединением, как это ->

SELECT
    users.user_id as 'id',
    IFNULL(CONCAT(users.first_name,' ',users.last_name),'') as 'name',
    IFNULL(GROUP_CONCAT(allergies.title),'') as 'allergies'
FROM (users
    LEFT JOIN user_allergies
        ON users.user_id = user_allergies.user_id
    LEFT JOIN allergies
        ON user_allergies.allergies_id = allergies.allergies_id
      )
GROUP BY users.user_id;

Которые отвечают именно так, как я хочу ->

7 | Khabib Nurmagamedov | Milk,Corn
8 | Conor Mcgregor      | Milk,Corn

Теперь я хочу получить dietaries таким же образом. Поэтому я добавил Left Join для диет ->

SELECT
    users.user_id as 'id',
    IFNULL(CONCAT(users.first_name,' ',users.last_name),'') as 'name',
    IFNULL(GROUP_CONCAT(allergies.title),'') as 'allergies',
    IFNULL(GROUP_CONCAT(dietaries.title),'') as 'dietaries'
FROM (users
    LEFT JOIN user_allergies
        ON users.user_id = user_allergies.user_id
    LEFT JOIN allergies
        ON user_allergies.allergies_id = allergies.allergies_id
    LEFT JOIN user_dietaries
        ON users.user_id = user_dietaries.user_id
    LEFT JOIN dietaries
        ON user_allergies.allergies_id = dietaries.dietaries_id
      )  
GROUP BY users.user_id;

Но теперь я получаю вывод ->

7 | Khabib Nurmagamedov | Milk,Corn,Eggs,Meat | Milk,Corn,Eggs,Meat
8 | Conor Mcgregor      | Milk,Corn,Eggs,Meat | Milk,Corn,Eggs,Meat

Что должно быть ->

7 | Khabib Nurmagamedov | Milk,Corn | Eggs,Meat
8 | Conor Mcgregor      | Milk,Corn | Eggs,Meat

Я борюсь здесь. Что я должен делать? Заранее спасибо.

Edit: Те ответ ->

7 | Khabib Nurmagamedov | Milk,Corn,Milk,Corn | Milk,Milk,Corn,Corn
8 | Conor Mcgregor      | Milk,Eggs,Milk,Eggs | Milk,Milk,Corn,Corn

Я думал, что обе таблицы объединяются, но, видимо, результат появляется дважды. Результат должен быть ->

7 | Khabib Nurmagamedov | Milk,Corn | Milk,Corn
8 | Conor Mcgregor      | Milk,Eggs | Milk,Corn

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Ваша проблема в том, что вы хотите, чтобы ваш GROUP_CONCAT был в 2 отдельных столбцах, и он не может так работать.

Вы должны присоединиться к результатам group_concat 2 раза из таблицы пользователя:

SELECT u.user_id as 'id',
             IFNULL(CONCAT(u.first_name,' ',u.last_name),'') as 'name',
             ua.allergies_c as 'allergies',
             ud.dietaries_c as 'dietaries'
FROM users u
LEFT JOIN
    (
        SELECT
            users.user_id ,
            IFNULL(GROUP_CONCAT(allergies.title),'') as allergies_c
        FROM (users
            LEFT JOIN user_allergies
                ON users.user_id = user_allergies.user_id
            LEFT JOIN allergies
                ON user_allergies.allergies_id = allergies.allergies_id
              )
        GROUP BY users.user_id
    ) ua ON u.user_id=ua.user_id
LEFT JOIN
    (
        SELECT
            users.user_id,
            IFNULL(GROUP_CONCAT(dietaries.title),'') as dietaries_c
        FROM (users
            LEFT JOIN user_dietaries
                ON users.user_id = user_dietaries.user_id
            LEFT JOIN dietaries
                ON user_dietaries.dietaries_id = dietaries.dietaries_id
              )
        GROUP BY users.user_id
    ) ud ON u.user_id=ud.user_id

Я сделал несколько массовых замен, чтобы поехать быстрее, возможно, вам нужно исправить некоторые вещи, но идея есть.

0 голосов
/ 14 марта 2019

Добавив Distinct до аллергий.title и dietaries.title, я могу получить желаемый результат.Но не уверен, почему поля заголовка появлялись дважды.

SELECT
    users.user_id as 'id',
    IFNULL(CONCAT(users.first_name,' ',users.last_name),'') as 'name',
    IFNULL(GROUP_CONCAT(Distinct allergies.title),'') as 'allergies',
    IFNULL(GROUP_CONCAT(Distinct dietaries.title),'') as 'dietaries'
FROM (users
    LEFT JOIN user_allergies
        ON users.user_id = user_allergies.user_id
    LEFT JOIN allergies
        ON user_allergies.allergies_id = allergies.allergies_id
    LEFT JOIN user_dietaries
        ON users.user_id = user_dietaries.user_id
    LEFT JOIN dietaries
        ON user_allergies.allergies_id = dietaries.dietaries_id
      )  
GROUP BY users.user_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...