根据 "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
我想做的是获取所有组的列表
- 其中 is_public 为真
- 返回 group.name 和 group.id
- 以及群组成员的数量。
- 从成员最多到最少排序
所以输出看起来像这样:
[
{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
,尽管也没有问题。
我正在做一个项目,并为此使用 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
我想做的是获取所有组的列表
- 其中 is_public 为真
- 返回 group.name 和 group.id
- 以及群组成员的数量。
- 从成员最多到最少排序
所以输出看起来像这样:
[
{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
,尽管也没有问题。