Присоединиться, чтобы дать список с необязательным столбцом отношения - PullRequest
0 голосов
/ 16 ноября 2009

Таблица:

        users: id INT

        items: id INT
               setid INT

         sets: id INT

relationships: userid INT
               itemid INT
               relationship ENUM('owner', 'participant')

Учитывая userid и setid, нам нужно сгенерировать список всех элементов в наборе и отношение пользователя к каждому элементу, если отношение существует. то есть результаты будут

setid    itemid   relationship
---------------------------------
1        1        NULL
1        2        owner
....

Следующее не работает, потому что второе предложение where удаляет строки, где relationship равно нулю:

select
    sets.id as setid,
    items.id as itemid,
    relatonships.relationship as relationship

from sets
    inner join items on sets.id = items.setid 
    left join relationships on relationships.itemid = items.id

where
    sets.id = 5
    and relationships.userid = 27

Однако второе предложение where исключает строки, в которых не существует существующей связи между этим элементом и данным пользователем. Как это можно сделать с помощью одного запроса?

Ответы [ 2 ]

1 голос
/ 16 ноября 2009

Это было очень просто, я не понимал, что вы можете проверить константу в предложении 'join ... on':

select
    sets.setid,
    items.itemid,
    relationships.relationship

from sets
    inner join items on items.setid = sets.id
    left join relationships
        on relationships.itemid = items.id
        and relationships.userid = 5
where
    sets.id = 1
0 голосов
/ 16 ноября 2009

Не 100%, что вы спрашиваете, попробуйте это

select
    sets.id as setid,
    items.id as itemid,
    relatonships.relationship as relationship

from sets
    inner join items on sets.id = items.event 
    LEFT join relationships on relationships.itemid = items.id

where
    sets.id = [say, 5]
    and relationships.userid = [say, 27]

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

Попробуйте следующий запрос:

select sets.id as setId,
       items.id as ItemId,
       relationships.relationship
from sets
    join users on 1=1
    join items on sets.id=items.setid
    left join relationships on relationships.itemId = items.id
where 
    sets.id=5 and users.id = 27

Добавляя таблицу пользователей в объединение с 1 = 1, вам не нужно предложение where для ссылки на таблицу отношений вообще

Изменить левое соединение на:

left join relationships on relationships.itemId = items.id 
AND relationships.userId=users.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...