2011-02-11 3 views
2

У меня есть простая БД со следующими двумя таблицами.SQL с расчетом на основе нескольких таблиц

Существует поле «один ко многим» между полем id в таблице сеансов и поле session_id в таблице кандидатов.

Мне нужен запрос, который будет SELECT * FROM SESSIONS.

SESSIONS (TABLE) 

|| id || title || max_candidates || description || 
|| 01 || fish || 05    || some string || 
|| 02 || birds || 10    || some string || 

CANDIDATES (TABLE) 

|| session_id || user_id || 
|| 01   || user01 || 
|| 02   || user12 || 
|| 02   || user03 || 
|| 02   || user05 || 

Однако, помимо возврата информации из таблицы сессий, я бы также хотел его, чтобы вернуть вычисляемый столбец Названный avaliable_spaces.

Я хотел бы иметь этот столбец возвращает количество avalaible пространства для конкретной сессии основе (не раз session_id происходит в CANDIDATES) - (max_candidates)

В приведенном выше примере это возвращение будет (очевидно, минус столбец headders);

|| id || title || max_candidates || description || avaliable_spaces || 

|| 01 || fish || 05    || some string ||04    || 
|| 02 || birds || 10    || some string ||07    || 

Имеет ли это смысл? И если да, возможно ли это? (как вы, наверное, можете догадаться) Я SQL noob, и это далеко от меня! Решение

+0

Ummm это проблема домашних заданий? – Noah

+0

Судя по «Тимбобу», похоже. – vol7ron

+0

Привет, нет - его «У меня очень ограниченный опыт SQL-проблемы». Большое спасибо за ваш вклад, я дам ему вихрь в понедельник. – user469453

ответ

5
SELECT S.id, 
     S.title, 
     S.max_candidates, 
     S.description, 
     S.max_candidates - COUNT(c.user_id) as available_spaces 
FROM SESSIONS S 
     LEFT OUTER JOIN CANDIDATES C 
     ON C.session_id = s.id 
GROUP BY S.id, 
      S.title, 
      S.max_candidates, 
      S.description 
+0

Не нужно для 'OUTER', левые соединения по сути являются внешними соединениями. – vol7ron

+0

@ vol7ron Нет причин не включать его. Это вопрос вкуса. –

+0

Существует множество причин: больший размер файла, более сложный для интерпретации, он делает код запутанным, он делает ваш код уродливым при форматировании (что кажется, что вы ничего не делаете), это просто необязательно. – vol7ron

1
SELECT 
    S.*, S.max_candidates - C.Filled AS avaliable_spaces 
FROM 
    SESSIONS S 
    LEFT JOIN 
    (
    SELECT session_id, COUNT(*) AS Filled FROM CANDIDATES GROUP BY session_id 
    ) C ON S.ID = C.session_id 
1

Мартина:

SELECT S.id, S.title, S.max_candidates, S.description , 
     S.max_candidates - COUNT(c.user_id) as available_spaces 
FROM SESSIONS S 
LEFT OUTER JOIN CANDIDATES C 
ON C.session_id = s.id 
GROUP BY S.id, S.title, S.max_candidates, S.description 

То же, что и выше, но отличается форматирование:

SELECT  S.id 
      , S.title 
      , S.max_candidates 
      , S.description 
      , S.max_candidates - count(c.user_id) AS available_spaces 
FROM  sessions S 
LEFT JOIN candidates C 
     ON C.session_id = s.id 
GROUP BY S.id, S.title, S.max_candidates, S.description 
+0

+1, хотя на абсурдном метрике счетчика первый ответ - 248 символов, а второй 308! –

+0

@Martin: lol :) Для меня легче читать все во втором, но если у вас есть 100 полей, не обязательно перечислять их в одной строке. То же самое для вложенных соединений; должны быть разные правила для разных ситуаций. Я думаю, когда он переходит к сжатию пробелов, это похоже на изображение, где последовательные цвета занимают почти одно и то же пространство, все пробелы сжимаются и генерируется шестнадцатеричное значение для его длины. Таким образом, это может быть 308 символов больше, но всего несколько байт больше. – vol7ron

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