我有一个表MyTable
,其值如下所示:
| id | name | type | category |
---------------------------------------------------
| 1 | Rob | Red | Rock |
| 2 | Rob | Blue | Rap |
| 2 | Rob | Blue | Rock |
| 3 | Jane | Green | Country |
| 3 | Jane | Green | Rap |
| 4 | Meg | Yellow | Rock |
| 5 | Jane | Blue | Rap |
| 5 | Jane | Blue | Rock |
| 6 | Jane | Red | Country |
| 6 | Jane | Red | Rock |
| 7 | Rob | Red | Rap |
| 7 | Rob | Red | Country |
| 8 | Meg | Green | Country |
| 9 | Meg | Blue | Rap |
现在,我的问题在于(因为数据是给我的),有重复的ID。每个ID代表一个报告,因此ID为1表示报告1.在此报告中,有name
,type
和category
。报告只能有一种类型,但可以包含多种类别。因此,重复的id来自不同的类别,每个类别构成一个新行。最终结果我希望实现它以列出一行中的名称,以及下一行中的所有类型+ count(其中count是不同类型的计数,如每个报告的一种类型)。它看起来像这样:
| Rob | Red(2), Blue(1) |
| Jane | Green(1), Blue(1), Red(1) |
| Meg | Yellow(1), Green(1), Blue(1)|
现在,我开发了一个实际使用两个子查询并成功实现此结果的查询。它去了
select name as firstCol, group_concat(type_counts order by countName desc separator ', ') as secondCol from
(select name, concat(type,' (',count(name),')') as type_counts, count(name) as countName from
(select name, type from
some join stuff
where (date_reported between '2014-11-01' and '2014-11-31')
group by id order by type, name) a
group by name, type order by name, count(name) desc) a
group by name;
此查询基本上按ID分组,以删除重复的ID并忽略由于不同类别而导致的拆分。然后,包装它的查询按名称和流量类型进行分组,将流量类型和名称数量连接在一起作为"类型(计数)"。第三组仅通过名称和组连接所有类型以具有名称列,然后是第二列,其中列出所有类型+计数并用逗号分隔。我只是想知道...是否有一个查询可以使它更快,因为不必使用这么多的子查询等?谢谢。
答案 0 :(得分:0)
我希望实现最终结果,列出一行中的名称,以及下一行中所有类型+ count(其中count是不同类型的计数,如每个报告的一种类型)。 / p>
将子查询用作SELECT子句中的表达式,将另一个子查询用作WHERE子句中的表达式。例如:
SELECT B.Name, B.UserId AS [User Link], (SELECT Count(B2.Name) FROM Badges B2 WHERE B2.Name = B.Name) as [Total Gold, Silver, and Bronze Badges Awarded for this Tag]
FROM Badges B
WHERE Class = 2
AND TagBased = 1
AND (SELECT Count(B2.Name)
FROM Badges B2
WHERE B2.Name = B.Name
AND B2.Class = 2
AND B2.TagBased = 1) = 1
GROUP BY B.Name, B.UserId
ORDER BY B.Name
<强>参考强>