查询:最多每个项目的聚集
-
07-07-2019 - |
题
通常你需要显示清单的数据库中的项目,和一些统计数字对每个项目。例如,当类型的标题的文本上堆溢出,相关的问题列表中出现。下面的列表显示了标题相关的项目和个单一的汇总数量的回应对于各个标题。
我有一个类似的问题,但需要多个集合体。我想显示项目列表中的任何3的格式根据用户选择:
- 我的项目的名称(15个总数中,13我拥有的)
- 我的项目的名称(总15)
- 我的项目的名称(13我拥有的)
我的数据库是:
- 项目:itemId,itemName,所有人id
- 类别:catId,catName
- 地图: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
这一得到:类别名称、数项id每个类别对这owner_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
但我怎么让他们在同一时间在一个单一的查询?即:类别名称、数项id每个类别,数项目id每个类别对这owner_id只
奖金。我怎么能任选的只是检索这里catId计!= 0对任何这些?在试图"在item_count <>0"我得到:
MySQL said: Documentation
#1054 - Unknown column 'rid_count' in 'where clause'
解决方案
这里有一个窍门:计算一个 SUM()
值得被称为是1或0相当于一个 COUNT()
行其中价值为1。你知道,布尔的比较返回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 BY
, HAVING
, , ORDER BY
条款。这些条款都运行后,所有的表达方式的选择-清单已经进行评价。
其他提示
你可以偷偷情况下的发言内SUM():
SELECT categories.catName,
COUNT(map.itemId) AS item_count,
SUM(CASE WHEN owner= @ownerid THEN 1 ELSE 0 END) AS owner_item_count
FROM categories
LEFT JOIN map ON categories.catId = map.catId
LEFT JOIN items ON items.itemId = map.itemId
GROUP BY categories.catId
HAVING COUNT(map.itemId) > 0
SELECT categories.catName,
COUNT(map.itemId) AS item_count,
COUNT(items.itemId) AS owner_item_count
FROM categories
INNER JOIN map
ON categories.catId = map.catId
LEFT JOIN items
ON items.itemId = map.itemId
AND items.owner = @ownerId
GROUP BY categories.catId
注意,你可以使用 HAVING
条款 owner_item_count
, 但内加入照顾的item_count你。
不隶属于 StackOverflow