Как получить все наборы данных, соответствующие условию. НЕ ИСХОДЯЩЕЕ СОЕДИНЕНИЕ

#postgresql #psql

#postgresql #psql

Вопрос:

Я хочу получить все команды, которые содержат определенный набор данных mitglieder И все другие наборы данных mitglieder в этих командах. Например:

Команда A получила Анну и Питера Митглидеров, команда B получила Анну, Марию и Джонни, а команда C получила Джонни и Мию. Если я хочу найти Анну, то результат должен выглядеть следующим образом:

введите описание изображения здесь КОЛИЧЕСТВО сейчас не важно.

Я пробовал этот код, но этот код выдает мне все наборы данных mitglieder.

 select teams.name, mitglieder.username, count(eintraege.eintrag_id) 
from (eintraege 
inner join teams 
    on eintraege.team = teams.team_id) 
right join mitglieder 
    on eintraege.mitglied = mitglieder.mitglied_id and mitglieder.mitglied_id = 101 
group by teams.name, mitglieder.username;
 

Заранее спасибо!!

Комментарии:

1. я думаю, что на eintraege.mitglied = mitglieder.mitglied_id и mitglieder.mitglied_id = 101 должно быть на eintraege.mitglied = mitglieder.mitglied_id где mitglieder.mitglied_id = 101

2. @JehadAhmadJaghoub нет, это не работает. Таким образом, я получаю только те, чей mitglieder_id равен 101, но я хочу, чтобы в этой команде были все mitglieder. Не только 101.

3. выберите teams.name , mitglieder.username, count(eintraege.eintrag_id) ИЗ eintraege СЛЕВА ПРИСОЕДИНИТЬСЯ к командам на eintraege. команда = команды. team_id ОСТАВИЛ ПРИСОЕДИНИТЬСЯ к mitglieder на eintraege.mitglied =mitglieder.mitglied_id упорядочить по teams.name попробуйте сделать это без group или вы можете группировать только с помощью mitglieder.username, но не team

4. @JehadAhmadJaghoub это не сработало бы из-за COUNT(), поэтому я должен ГРУППИРОВАТЬ ПО, но если я ГРУППИРУЮ ПО mitglieder.username, как вы предложили, это тоже не сработает.

5. Какое количество вы хотите?

Ответ №1:

Привет, я думаю, это ваш ответ

 select teams.name, mitglieder.username, count(eintrag_id) 
FROM eintraege 
LEFT JOIN teams on eintraege.team = teams.team_id 
LEFT JOIN mitglieder on eintraege.mitglied =mitglieder.mitglied_id 
where teams.team_id in (SELECT team from eintraege where mitglied = 1)
group by name, mitglied_id
order by teams.name
 

рабочий пример
http://sqlfiddle.com /#!9/3956 дБ/3

Комментарии:

1. да, также с count, поскольку я думаю, что distinct не будет учитывать дублирование 🙂

Ответ №2:

Начните с mitglieder, затем присоединитесь к teams через eintraege, чтобы получить команды, к которым принадлежит Анна, в качестве основы запроса, затем снова присоединитесь к другим таблицам, чтобы создать результат:

 select distinct t.name, m2.username
from mitglieder m1
join eintraege e1 on e1. mitglieder = m1. mitglieder_id
join teams t on t.team_id = e1.team
join eintraege e2 on e2.team = t.team_id
join mitglieder m2 on m2. mitglieder_id = e2.mitglieder
where m1.username = 'Anna'
 

Вы не определили, какое количество вы хотите, поэтому я оставил это.

Комментарии:

1. Во-первых, e2.username не может работать, вы имеете в виду, может быть, m2. В любом случае, когда я запускаю это, я получаю, что все 414 строк в основном дублируются более 20 раз. Во-вторых, COUNT() не важен.

2. Теперь я получаю все команды и их участников (mitglieder), но я хочу получить все команды и их участников (mitglieder), которые содержат определенного участника (mitglieder)

3. @lulk Я пропустил where предложение. Попробуйте сейчас.

4. Теперь я понимаю, что мне пришлось добавить в вашу третью строку это «и m1.mitglied_id = 101»

5. Если вы знаете идентификатор mitglieder, начните с mitglieder, но идентификаторы ненадежны и не должны использоваться / известны вне запроса. Лучше и надежнее использовать общедоступную информацию, такую как имя пользователя, для поиска

Ответ №3:

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

 SELECT      TEAMS.NAME,
            EINTRAEGE_MITGLIEDER.USERNAME, 
            EINTRAEGE_MITGLIEDER.EINTRAG_ID
FROM        TEAMS TEAMS,
            (SELECT     MITGLIEDER.USERNAME, 
                        COUNT(EINTRAEGE.EINTRAG_ID),
                        EINTRAEGE.TEAM
            FROM        EINTRAEGE EINTRAEGE,
                        MITGLIEDER MITGLIEDER
            WHERE       EINTRAEGE.MITGLIED = MITGLIEDER.MITGLIED_ID
            AND         AND MITGLIEDER.MITGLIED_ID = 101
            GROUP BY    MITGLIEDER.USERNAME,
                        EINTRAEGE.TEAM) EINTRAEGE_MITGLIEDER
WHERE       TEAMS IN (  SELECT      EINTRAEGE.EINTRAG_ID
                        FROM        EINTRAEGE.MITGLIED = MITGLIEDER.MITGLIED_ID
                        AND         AND MITGLIEDER.MITGLIED_ID = 101
                     )
AND         TEAMS.TEAM_ID = EINTRAEGE_MITGLIEDER.TEAM