基于多个表格的计算SQL

3

我有一个简单的数据库,其中包含以下两个表。

sessions表中的id字段和candidates表中的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  ||

然而,除了从sessions表返回信息外, 我还希望它返回一个名为avaliable_spaces的计算列
我想让这个列基于(session_idCANDIDATES中出现的次数)-(max_candidates)来返回特定会话的可用空间数量。
在上面的示例中,它将返回(显然减去headders列);
|| id || title || max_candidates || description || avaliable_spaces ||

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

这有意义吗?如果有的话,这种情况是否可能!?(你可能已经猜到了) 我是一个 SQL 新手,这超出了我的能力范围!


这是一个作业问题吗? - Noah
根据“Timbob”,看起来是这样的。 - vol7ron
嗨,不是-这是一个“我对SQL问题经验极其有限”的问题。非常感谢您的输入,我会在周一试一试。 - user469453
2个回答

6
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  

1
@vol7ron 没有理由不包含它。这只是个人口味问题。 - Martin Smith
3
@vol7ron - 哈哈,这并不会使其更难解释或更加复杂。丑陋显然是主观的,你认为可选的 "OUTER" 关键字应该不使用因为它对文件大小的影响是可笑的。你是否因类似的原因给所有表格和列都一个字符的名称?无论如何,您应该高兴缺少格式化。空格占用有价值的字节 :-) - Martin Smith
1
@Martin:你认为我的评论只适用于一个项目中的一个查询中的一个连接语句,这是“可笑”的。你不考虑嵌套连接或复杂的递归语句,这表明你缺乏经验。是的,额外的关键字确实使阅读更加困难,但你的论点毫无根据。空格不会占用任何额外的字节,而如果我选择在每个完整、左侧或右侧连接的地方都使用OUTER,那么如果你像我一样有很多项目,它们会累加起来。不幸的是,当你以合同价格购买时,空间的节约仍然很重要。 - vol7ron
1
@扣分的人:我并不是说他的解决方案值得被扣掉“-1”分,因为我同意格式和易读性是主观的,但是有研究表明,在给定两个相等的常见短语时,用较少的单词来解释更容易理解。 - vol7ron
我认为gbn的解决方案会更快,因为它具有较少的分组条件。 - vol7ron
显示剩余7条评论

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接