根据 "home" 和 "away" 表中的条件计算引用数量的最佳方法是什么?

What's the best way to count the number of references based on conditions in both "home" and "away" tables?

我正在做一个项目,并为此使用 Knex,(尽管如果你给我原始的 SQL 我很确定我也可以转换它。)

那么,问题来了。

我有表 'group' 和 'user_group'。

table 'group' 
  id: integer
  name: string
  is_public: boolean
table 'user_group'
  group_id: ref(group.id)
  user_id: ref(user.id) // don't need user table info for this
  role: string 

我想做的是获取所有组的列表

所以输出看起来像这样:

[
  {name: "Clowns", memberCount: 20, id: 3},
  {name: "Puppets", memberCount: 12, id: 36},
  {name: "Jugglers", memberCount: 5, id: 12},
  ...
]

这是我目前得到的:

  SELECT COUNT('*') AS memberCount, group.name AS name, group.id AS id
  FROM group
  INNER_JOIN user_group on group.id = user_group.group_id
  WHERE group.is_public = true
  AND WHERE user_group.role = "MEMBER"
  ORDER BY memberCount ASC`

我走在正确的轨道上吗?

如果您使用的是 MS-SQL,那么以下查询会对您有所帮助。 聚合函数经常和SELECT的GROUP BY子句一起使用statement.So你需要用到group by子句

     SELECT COUNT(*) AS memberCount, group.name AS name, group.id AS id
       FROM group
 INNER_JOIN user_group on group.id = user_group.group_id
       WHERE group.is_public = 1

----如果列是位数据类型则为

置 1

正确。

       AND WHERE user_group.role = 'MEMBER'
  group by group.name,group.id
  ORDER BY COUNT(*) ASC

tableuser_group必须这样分组:

SELECT group_id, COUNT(user_id) AS memberCount
FROM user_group
WHERE role = 'MEMBER'
GROUP BY group_id

通过这个分组你可以得到属于每个组的用户数。
现在上面的查询必须加入 group table:

SELECT
  ug.memberCount, g.name, g.id
FROM group AS g
INNER JOIN (
    SELECT group_id, COUNT(user_id) AS memberCount
    FROM user_group
    WHERE role = 'MEMBER' 
    GROUP BY group_id
) AS ug
ON ug.group_id = g.id
WHERE g.is_public = TRUE
ORDER BY ug.memberCount DESC, g.name

以上查询将 return 仅包含至少 1 名成员的群组。
如果您还想要所有其他成员为 0 的组,则需要 LEFT JOIN:

SELECT
    COALESCE(ug.memberCount,  0) AS memberCount, g.name, g.id
FROM group AS g
LEFT JOIN (
    SELECT group_id, COUNT(user_id) AS memberCount
    FROM user_group
    WHERE role = 'MEMBER' 
    GROUP BY group_id
) AS ug
ON ug.group_id = g.id
WHERE g.is_public = TRUE
ORDER BY ug.memberCount DESC, g.name

我会这样处理:

SELECT g.name, g.id, COUNT(ug.role) AS memberCount
FROM group g LEFT JOIN
     user_group ug
     ON ug.group_id = g.id AND
        ug.role = 'MEMBER'
WHERE g.is_public
GROUP BY g.name, g.id
ORDER BY memberCount DESC;

这是如何构建的?首先,这是使用 LEFT JOIN,因为您需要 all 个组,甚至可能是那些没有成员的组。由于 LEFT JOIN,角色的条件位于 ON 子句中,而不是 WHERE 子句中。

一些其他注意事项:

  • 对字符串和日期常量使用单引号。这是 SQL 标准。
  • SELECT 中的所有键聚合。
  • 要获得从最高到最低的结果,请使用 DESC ORDER BY
  • 不需要为布尔值指定 = true,尽管也没有问题。