2015-01-08 4 views
1

Я пытаюсь соединить 4 таблицы:MySQL присоединение 4 таблицы

Мои столы являются:

  • пользователей (данные пользователя),
  • группы (информационные группы),
  • users_groups (информация о группах пользователей: от многих до многих. Пользователь может быть членом многих групп, группа может иметь много членов),
  • user_favorite_group (любимая группа пользователей).


Подробная информация таблица:

  • пользователей: идентификатор, имя, адрес электронной почты, несколько других информационных полей
    например 1, chatu rohra, [email protected], несколько других информационных полей
  • группы: идентификатор, имя, адрес электронной почты, несколько других информационных полей
    например. 1, SOME_GROUP_NAME [email protected], несколько других информационных полей
  • users_groups: id, user_id, group_id.
    , например. 1, 1, 1
  • user_favorite_group: id, user_id, user_group_id.
    , например. 1, 1, 1

  • Я могу присоединиться первые три таблицы (пользователи, группы, users_groups), но не user_favorite_group. Мой запрос:

    SELECT 
    users.*, 
    GROUP_CONCAT(DISTINCT groups.name ORDER BY groups.name ASC SEPARATOR ', ') as groups 
    FROM users_groups 
        INNER JOIN users ON users.id = users_groups.user_id 
        INNER JOIN groups ON groups.id = users_organizations.organization_id 
        WHERE users.id = 1; 
    

    Это дает мне:
    users.id, users.name, users.email, группы 1, chatu rohra, [email protected], SOME_GROUP_NAME

    Что бы хотел бы видеть это .. предполагая там больше групп в группах таблице:
    1, chatu rohra, [email protected], "AND_ANOTHER, SOME_GROUP_NAME, SOME_OTHER_GROUP", "SOME_OTHER_GROUP"

    4-поле является списком групп, в которых я являюсь и моя любимая группа, как пятая поле.

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

    Спасибо.

    +0

    Вы можете разместить несколько строк данных выборки и ожидаемые результаты, таким образом кто-то еще может воссоздать проблему? [SQL Fiddle] (http://www.sqlfiddle.com) будет полезен, если вы сможете его создать. – AdamMc331

    +0

    "user_favorite_group: id, user_group_id'": имеет ли 'user_favorite_group' столбец' user_id'? Я вижу только «id». –

    +0

    @MichaelBerkowski Вы правы. user_id добавляется в user_favorite_group. Благодарю. – chatu

    ответ

    0

    Самый простой путь, чтобы присоединиться ваш user_favorite_group стол, чтобы добавить его в качестве дополнительного LEFT JOIN на user_id, чтобы получить пользователя часть отношений, но затем добавить дополнительный INNER JOIN к groups таблицы, чтобы получить имя группы. Может не работать, чтобы получить имя группы из существующего INNER JOIN против groups.

    SELECT 
        users.*, 
        GROUP_CONCAT(DISTINCT groups.name ORDER BY groups.name ASC SEPARATOR ', ') as groups, 
        gfav.name AS favorite_group 
    FROM users_groups 
        INNER JOIN users ON users.id = users_groups.user_id 
        INNER JOIN groups ON groups.id = users_organizations.organization_id 
        -- Join user to user_favorite_group 
        -- Using LEFT JOIN in case the user has no favorite, it will return a NULL. 
        LEFT JOIN `user_favorite_group` ON users.id = user_favorite_group.user_id 
        -- Join that to `groups` to get its group name 
        INNER JOIN groups gfav ON user_favorite_group.user_group_id 
    WHERE users.id = 1 
    -- MySQL will allow only users.id in the GROUP BY (or none at all) 
    -- but know that this isn't entirely portable. 
    GROUP BY users.id 
    

    Глядя снова на имена ваших столбцов, возможно, я неправильно понял отношения.если user_favorite_group.user_group_id фактически указывает как FOREIGN KEY к user_groups.id, а не groups.id как я выразился здесь, вы на самом деле нужен еще один дополнительный присоединиться:

    FROM users_groups 
        INNER JOIN users ON users.id = users_groups.user_id 
        INNER JOIN groups ON groups.id = users_organizations.organization_id 
        -- Join user to user_favorite_group 
        -- Using LEFT JOIN in case the user has no favorite, it will return a NULL. 
        LEFT JOIN `user_favorite_group` ON users.id = user_favorite_group.user_id 
        -- Join through `user_groups` to get the relationship 
        INNER JOIN user_groups ugfav ON user_favorite_group.user_group_id = ugfav.id 
        -- Join ultimlately back to `groups` to get the group name. 
        INNER JOIN groups gfav ON ugfav.group_id = .gfav.id 
    
    +0

    Если вы удалите 'GROUP BY', вы получите другой результат? –

    +0

    Ой, подождите, это 'user_favorite_group.user_group_id' указатель FK к таблице' groups.id' или 'user_groups.id'? Возможно, у меня есть неправильное отношение ... –

    +0

    Спасибо @ialphan. – chatu