Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用一个SQL查询计算拥有某个游戏的用户数?_Sql - Fatal编程技术网

如何使用一个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中,您可能不需要它。