#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