通常,您需要显示数据库项的列表以及每个项的某些聚合数字。例如,在堆栈溢出时键入标题文本时,将显示“相关问题”列表。该列表显示相关条目的标题以及每个标题的单个聚合响应数量。我有一个类似的问题,但需要多个聚合。我想根据用户选项以三种格式之一显示项目列表:我的物品名称(共15件,13件归我所有)我的物品名称(共15个)我的物品名称(我拥有13个)我的数据库是:项目:itemId、itemName、ownerId类别:catId,catName地图:mapId,itemId,catId下面的查询获取:类别名称,每个类别的项目ID计数SELECT categories.catName, COUNT(map.itemId) AS item_countFROM categoriesLEFT JOIN map ON categories.catId = map.catIdGROUP BY categories.catName此项仅获取:类别名称,此所有者的每个类别的项目id计数SELECT categories.catName,COUNT(map.itemId) AS owner_item_countFROM categoriesLEFT JOIN map ON categories.catId = map.catIdLEFT JOIN items ON items.itemId = map.itemIdWHERE owner = @ownerIdGROUP BY categories.catId但是如何在一个查询中同时获取它们呢?即:类别名称、每个类别的项目id计数、仅此所有者id的每个类别的项目id计数奖金。我怎么能选择只检索catId计数的地方!其中任何一个等于0?在尝试“WHERE item_count0”时,我得到:MySQL said: Documentation#1054 - Unknown column 'rid_count' in 'where clause' 最佳答案 这里有一个技巧:计算已知为1或0的值的SUM()相当于计算值为1的行的COUNT()。您知道布尔比较返回1或0(或NULL)。SELECT c.catname, COUNT(m.catid) AS item_count, SUM(i.ownerid = @ownerid) AS owner_item_countFROM 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_countFROM 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_countFROM categories c LEFT JOIN map m USING (catid) LEFT JOIN items i USING (itemid)GROUP BY c.catidHAVING item_count > 0;不能在WHERE子句中使用列别名,因为WHERE子句中的表达式在选择列表中的表达式之前求值。换句话说,与选择列表表达式关联的值尚不可用。您可以在GROUP BY、HAVING和ORDER BY子句中使用列别名。这些子句在对“选择”列表中的所有表达式求值之后运行。关于mysql - 查询:每个项目计数多个聚合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/281866/
10-11 04:31