2016-03-20 2 views
-1

У меня есть 3 таблицы:SQL SELECT из трех таблиц с требованиями

Игрок:

  • playernumber
  • имя
  • инициалы
  • date_of_birth
  • пол

Fine:

  • Номер платежа
  • playernumber
  • Дата
  • количество

Committee_member:

  • playernumber
  • start_date
  • end_date
  • функция

Так выход я хотел бы получить бы; имя, инициалы, сумма. Но я только хочу видеть игроков с штрафом, которые также являются членами комитета. Я попытался это:

SELECT name, initials, amount 
FROM Player 
JOIN Fine on Player.playernumber = Fine.playernumber 
JOIN Committee_member on Player.playernumber = Comittee_member.playernumber 

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

Благодаря людям на этом сайте я узнал, что WHERE EXISTS (...) может решить мою проблему:

SELECT name, initials, amount 
FROM Player 
JOIN Fine on Player.playernumber = Fine.playernumber 
WHERE EXISTS (SELECT * 
FROM Committee_member 
WHERE Player.playernumber = Comittee_member.playernumber) 

Дополнительной вещь, которую вы могли бы сделать, это подсчитать количество штрафов каждый член комиссии имеет по:

SELECT name, initials, COUNT(amount) as 'amount' 
FROM Player 
JOIN Fine on Player.playernumber = Fine.playernumber 
WHERE Player.playernumber IN (SELECT playernumber from Committee_member) 
GROUP BY name, initials 
+0

Ну - это вполне может быть правильным, если ваши данные говорит. Мы не можем видеть ваши данные, поэтому трудно сказать. Но, похоже, вам не нужно вступать в Комитет. Вы не используете данные ни для чего? –

+0

@ AllanS.Hansen Мне бы хотелось только увидеть членов комитета, у которых есть штраф, поэтому мне это нужно. –

+2

Вместо того чтобы присоединиться к Comittee_member, вы можете использовать 'WHERE EXISTS (SELECT * FROM Comittee_member c где c.playernumber = p.playernumber)' – maraca

ответ

-1

Вы можете использовать оператор GROUP BY для получения уникальных результатов. См. the MySQL docs.

2

Мое предположение, что игроки могут быть более чем в одном комитете или иметь более одного штрафа. Таким образом, использование group by:

SELECT p.name, p.initials, SUM(f.amount) as total_fines 
FROM Player JOIN Fine 
    ON p.playernumber = f.playernumber JOIN 
    Committee_member cm 
    ON p.playernumber = cm.playernumber 
GROUP BY p.name, p.initials; 
0

Вот еще короче альтернатива:

SELECT name, initials, amount 
FROM Player 
JOIN Fine on Player.playernumber = Fine.playernumber 
WHERE Player.playernumber IN (SELECT playernumber FROM Committee_member) 
+0

Почему downvote? Он добавил оба решения * после того, как * я прокомментировал/ответил на его вопрос. Btw. он никогда не говорил, что хочет суммировать суммы. – maraca

Смежные вопросы