如何使用一个SQL查询计算拥有某个游戏的用户数?
我有一张游戏桌,像这样:如何使用一个SQL查询计算拥有某个游戏的用户数?,sql,Sql,我有一张游戏桌,像这样: ID | game name 1 legend of zelda 2 metal gear solid 3 resident evil ID | User ID | Game ID 1 510 2 2 879 2 3 213 3 还有一张拥有这些游戏的用户表,如下所示: ID | game name 1 legend of zelda 2 metal gear solid 3
ID | game name
1 legend of zelda
2 metal gear solid
3 resident evil
ID | User ID | Game ID
1 510 2
2 879 2
3 213 3
还有一张拥有这些游戏的用户表,如下所示:
ID | game name
1 legend of zelda
2 metal gear solid
3 resident evil
ID | User ID | Game ID
1 510 2
2 879 2
3 213 3
我需要制作一个游戏列表,其中有许多用户拥有这些游戏。根据上述情况,结果将是:
塞尔达传奇(0个用户)金属齿轮实心(2个用户)
生化危机(1个用户) 如何仅使用1个SQL查询执行上述操作
SELECT g."game name" AS name, COUNT(u.ID) AS users
FROM games AS g LEFT JOIN game_users AS u
ON g.ID = u."Game ID"
GROUP BY g."game name"
我在包含分隔标识符的空间中使用了SQL标准双引号,因为您没有标识您正在使用的SQL的子种类
这将为您提供两列输出-游戏名称和简单计数。如果您想要装饰性的“(0个用户)”和“(1个用户)”符号,那么您将陷入更严重的痛苦,除非您的DBMS提供了一个方便的功能来处理语言中不同数量对象的正确屈折变化(显然是英语-但规则因语言而异)
使用头脑简单的计算机:
SELECT TRIM(r.name) || ' (' || r.users || ' users)'
FROM (SELECT g."game name" AS name, COUNT(u.ID) AS users
FROM games AS g LEFT JOIN game_users AS u
ON g.ID = u."Game ID"
GROUP BY g."game name") AS r
或者,稍微复杂一点(但仅限于英语):
然而,在我的书中,SQL是用于数据的;演示最好在应用程序中完成。因此,我可能会使用第一个查询
我在包含分隔标识符的空间中使用了SQL标准双引号,因为您没有标识您正在使用的SQL的子种类
这将为您提供两列输出-游戏名称和简单计数。如果您想要装饰性的“(0个用户)”和“(1个用户)”符号,那么您将陷入更严重的痛苦,除非您的DBMS提供了一个方便的功能来处理语言中不同数量对象的正确屈折变化(显然是英语-但规则因语言而异)
使用头脑简单的计算机:
SELECT TRIM(r.name) || ' (' || r.users || ' users)'
FROM (SELECT g."game name" AS name, COUNT(u.ID) AS users
FROM games AS g LEFT JOIN game_users AS u
ON g.ID = u."Game ID"
GROUP BY g."game name") AS r
或者,稍微复杂一点(但仅限于英语):
然而,在我的书中,SQL是用于数据的;演示最好在应用程序中完成。因此,我可能会使用第一个查询。加入他们,根据游戏id分组,然后选择行的计数(*),或计数(不同的用户)。如果一个人拥有游戏两次,而你希望这只算一个拥有者,不同的用户
SELECT game.name, count(*)
FROM games
JOIN ownershipInfo
ON games.id = ownershipInfo.id
GROUP BY game.name --missing from original answer, oops
这将为您提供行数
因为您想要包含零的位置,所以请执行“左连接”而不是普通连接。如果您不希望计数行,而是希望计数不同的所有者:
SELECT game.name, count(distinct ownershipInfo.ownerID)
FROM games
JOIN ownershipInfo
ON games.id = ownershipInfo.id
GROUP BY game.name --missing from original answer, oops
正如jonathon指出的那样,您需要一个小组来获取聚合信息。在这里,我只是采取了按名称分组的权宜之计——通常你会按游戏ID分组,然后做一些更像:
SELECT max(game.id), count(distinct ownershipInfo.ownerID)
FROM games
LEFT JOIN ownershipInfo
ON games.id = ownershipInfo.id
GROUP BY games.id
这样,如果两个游戏有相同的名称,你会得到两个游戏的一行(当然这不是不言自明的,但也许你也会有MAX(出版商)或其他东西来澄清哪一个是哪一个)加入他们,在游戏id上分组,然后选择行数(*)或计数(不同的用户)。如果一个人拥有游戏两次,而你希望这只算一个拥有者,不同的用户
SELECT game.name, count(*)
FROM games
JOIN ownershipInfo
ON games.id = ownershipInfo.id
GROUP BY game.name --missing from original answer, oops
这将为您提供行数
因为您想要包含零的位置,所以请执行“左连接”而不是普通连接。如果您不希望计数行,而是希望计数不同的所有者:
SELECT game.name, count(distinct ownershipInfo.ownerID)
FROM games
JOIN ownershipInfo
ON games.id = ownershipInfo.id
GROUP BY game.name --missing from original answer, oops
正如jonathon指出的那样,您需要一个小组来获取聚合信息。在这里,我只是采取了按名称分组的权宜之计——通常你会按游戏ID分组,然后做一些更像:
SELECT max(game.id), count(distinct ownershipInfo.ownerID)
FROM games
LEFT JOIN ownershipInfo
ON games.id = ownershipInfo.id
GROUP BY games.id
这样一来,如果两款游戏的名称相同,那么两款游戏都会引起争议(当然,这不是不言自明的,但也许你也会有MAX(出版商)或其他人来澄清哪款游戏是哪款游戏)这难道不应该是一个左撇子加入到“塞尔达传奇(0个用户)”案例中吗?牢骚……是的;零号案件需要处理。您还必须使用
COUNT(u.ID)
,以确保不计算空值。谢谢去展示没有人是完美的(我并不是在这个方向上提出任何主张),代码审查可以帮助每个人D难道这不应该是一个左撇子来接“塞尔达传奇(0个用户)”的案子吗?抱怨…是的;零号案件需要处理。您还必须使用COUNT(u.ID)
,以确保不计算空值。谢谢去展示没有人是完美的(我并不是在这个方向上提出任何主张),代码审查可以帮助每个人请指定表名;当我们不得不猜测时,使用不同的表名比较答案会变得更加困难,因为我们没有一套正式的名称可供使用;当我们不得不猜测时,使用不同的表名比较答案会变得更加困难,因为我们没有一组正式的名称可供使用。在标准SQL中,您需要一个GROUPBY子句。在MySQL中,您可能不需要它,而在标准SQL中,您需要一个GROUPBY子句。在MySQL中,您可能不需要它。