当前位置: 首页 > 面试题库 >

查询:每个项目计数多个聚合

邹锦
2023-03-14
问题内容

通常,您需要显示数据库项目的列表以及有关每个项目的特定汇总号。例如,当您在“堆栈溢出”中键入标题文本时,将出现“相关问题”列表。该列表显示了相关条目的标题以及每个标题的响应数量的单个汇总数量。

我有一个类似的问题,但需要多个聚合。我想根据用户选项以3种格式中的任何一种显示项目列表:

  • 我的商品的名称(共15个,我拥有的13个)
  • 我的商品的名称(共15个)
  • 我的商品的名称(我拥有13个)

我的数据库是:

  • items :itemId,itemName,ownerId
  • categories :catId,catName
  • map :mapId,itemId,catId

下面的查询获取:类别名称,每个类别的项目ID数

SELECT
  categories.catName,
  COUNT(map.itemId) AS item_count
FROM categories
LEFT JOIN map
  ON categories.catId = map.catId
GROUP BY categories.catName

这将获得:类别名称,仅此owner_id的每个类别的项目ID数

SELECT categories.catName, 
COUNT(map.itemId) AS owner_item_count
FROM categories
LEFT JOIN map
  ON categories.catId = map.catId
LEFT JOIN items
  ON items.itemId = map.itemId
WHERE owner = @ownerId
GROUP BY categories.catId

但是,如何在单个查询中同时获取它们?即:类别名称,仅此owner_id的每个类别的项目ID的数量,每个类别的项目ID的数量

奖金。我怎样才能有选择地只检索其中任何一个的catId count!= 0?在尝试“ WHERE item_count <> 0”时,我得到:

MySQL said: Documentation
#1054 - Unknown column 'rid_count' in 'where clause'

问题答案:

这是一个技巧:计算SUM()已知为1或0COUNT()的值的a等于该值为1的行中的a。并且您知道布尔比较返回1或0(或NULL)。

SELECT c.catname, COUNT(m.catid) AS item_count,
  SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
  LEFT JOIN map m USING (catid)
  LEFT JOIN items i USING (itemid)
GROUP BY c.catid;

至于奖励问题,您可以简单地执行内部联接而不是外部联接,这意味着仅map返回至少包含一行的类别。

SELECT c.catname, COUNT(m.catid) AS item_count,
  SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
  INNER JOIN map m USING (catid)
  INNER JOIN items i USING (itemid)
GROUP BY c.catid;

这是另一种解决方案,虽然效率不高,但我将向您展示它来解释为什么会出现此错误:

SELECT c.catname, COUNT(m.catid) AS item_count,
  SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
  LEFT JOIN map m USING (catid)
  LEFT JOIN items i USING (itemid)
GROUP BY c.catid
HAVING item_count > 0;

您不能在WHERE子句中使用列别名,因为WHERE子句中的表达式先于选择列表中的表达式求值。换句话说,与选择列表表达式关联的值尚不可用。

您可以在使用列别名GROUP BYHAVINGORDER BY条款。在选择列表中的所有表达式都被求值之后,将运行这些子句。



 类似资料:
  • 问题内容: 可以按多行订购吗? 我希望我的用户按last_activity进行排序,但与此同时,我希望带有图片的用户出现在没有图片的用户之前 像这样: 问题答案:

  • 问题内容: 我很难优化我的SQLAlchemy查询。我的SQL知识非常基础,我无法从SQLAlchemy文档中获得所需的知识。 假设以下非常基本的一对多关系: 我怎么能: 查询每个父母的元组? 经过相当长的搜索时间后,我发现了如何分别查询这些值: 我试图以不同的方式将它们组合在一起,但没有设法得到我想要的。 查询所有顽皮孩子超过80%的父母?编辑:顽皮可能为NULL。 我猜想此查询将基于上一个查询

  • 我需要一些关于我的GridLayoutManager的帮助。 如果我有一个项目,它应该在中间正常显示。 对于两个项目,它们应该彼此相邻。从三到四个项目的示例,它应该像正方形一样显示。3个项目的示例4个项目的示例 如果我是对的,spanCount 2应该就是这种情况。但是,如果有5个项目(所以连续3个),那就有问题了 从5个项目(及以上)开始,每个项目应该是连续3个,例如有5个项目,如果底部行的项目

  • 问题内容: 我正在尝试在单个查询中计算两列,但结果却为medcount和uploadcount吐出了相同的值。有什么建议? 问题答案: 使用:

  • 问题内容: 给定一个简单的模式,例如PurchaseOrders {OrderId,Total,LineItemCount},我想为一些简单的统计信息生成一个简单的查询,如下所示: 但是在Linq to Sql中,我正在努力将其纳入一个查询中。 目前,我有这个: 有没有一种方法可以将其作为一个查询来完成? 问题答案: 我能想到的是给它一个假的group-by子句。它可以正常工作,并能按您期望的那样

  • 问题内容: 我正在从地名数据库中查找城市。典型的搜索字符串是“ San Francisco CA”。我有包含城市和州域的文档。我进行查询,将搜索字符串匹配到城市和州,然后使用组合这些匹配项: 我的数据库中有以下两个文档: 问题在于,将“ san”匹配到圣马力诺州的得分要比将CA匹配到旧金山州的得分高得多,因为存在许多州“ CA”的城市和很少州“ San Marino”的城市。 我尝试使用禁用IDF