双子查询

时间:2015-06-08 15:40:51

标签: mysql group-by subquery query-optimization aggregate-functions

我有一个表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.在此报告中,有nametypecategory。报告只能有一种类型,但可以包含多种类别。因此,重复的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并忽略由于不同类别而导致的拆分。然后,包装它的查询按名称和流量类型进行分组,将流量类型和名称数量连接在一起作为"类型(计数)"。第三组仅通过名称和组连接所有类型以具有名称列,然后是第二列,其中列出所有类型+计数并用逗号分隔。我只是想知道...是否有一个查询可以使它更快,因为不必使用这么多的子查询等?谢谢。

1 个答案:

答案 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

<强>参考