选择....?

时间:2013-06-07 14:35:28

标签: mysql sql

我想输出一个客户列表,其中包含他已注册的事件的名称和数量。

像这样:

 max (3)Sports,Food,Cinema
 tom (2) Food, Sports

我无法让它发挥作用。我总是得到这个结果:

 max Sports
 max Food
 max Cinema
 tom Food
tom Sports

我有大约这个表设置:

+-----+-----------+-------+-----+
+ CID + Customer  + misc..+ ... +
+-----+-----------+-------+-----+
+ 1   +   max      +  abc  + ... +
+-----+-----------+-------+-----+
+ 2   +  tom      +  xyz  + ... +
+-----+-----------+-------+-----+


+-----+------------+--------+---------+-----+
+ EID + RID        + Event  + misc... + ... +
+-----+------------+--------+---------+-----+ 
+ 1   +            + Sports + misc... + ... +
+-----+------------+--------+---------+-----+ 
+ 2   +            + food   + misc... + ... +
+-----+------------+--------+---------+-----+ 
+ 3   +            + cinema + misc... + ... +
+-----+------------+--------+---------+-----+ 
+ 4   +            + Event  + misc... + ... +
+-----+------------+--------+---------+-----+ 


+-----+-----+-----+
+ RID + EID + CID +
+-----+-----+-----+
+ 1   + 1   + 1   +
+-----+-----+-----+
+ 2   + 2   + 1   +
+-----+-----+-----+
+ 3   + 3   + 1   +
+-----+-----+-----+
+ 4   + 1   + 2   +
+-----+-----+-----+
+ 5   + 2   + 2   +
+-----+-----+-----+

我用GROUP_CONCAT()尝试了它,但这似乎不是它的方式......

我已加入所有表格,但我认为我需要2个查询来解决此任务。

我在我的while循环中尝试了一个选择,但这是废话,它极其缓慢......

我试过这个:

$sql1 = "SELECT  et.Art,  et.Kategorie, et.ID, et.Event AS Event1,
  GROUP_CONCAT( loc.ORT )       AS ORT1
  FROM ".DB_CUSTOMERS_TABLE."      AS et
  JOIN ".DB_RELATIONS_TABLE." AS rel
  ON (et.id =  rel.EID)
  JOIN ".DB_EVENT_TABLE."  AS loc
  ON (loc.Location_ID = rel.Location_ID)
  GROUP BY rel.EID
       ";

我需要一个理想,我怎么能以一种很好的方式解决这个问题。

这是读书的好处。我希望我不要混淆。

2 个答案:

答案 0 :(得分:2)

您希望实现的是每位客户的汇总结果。

您目前正在做的是按关系进行聚合,而关系本身就是聚合的主题。

为此,您必须按要应用聚合的列进行分组,即:客户名称。

然后,您可以使用简单的COUNT()和GROUP_CONCAT来实现您想要的聚合。

工作示例:http://sqlfiddle.com/#!2/85daa/4

答案 1 :(得分:0)

您需要对您要选择的每个字段进行分组,而不是您要列出的字段,因为您的查询与您的问题中提供的信息不符,所以很难判断,但从您的示例中简化为:

SELECT Name, GROUP_CONCAT(Event)
FROM table
GROUP BY Name

所以它可能很简单:

$sql1 = "SELECT  et.Art,  et.Kategorie, et.ID, et.Event AS Event1,
  GROUP_CONCAT( loc.ORT )       AS ORT1
  FROM ".DB_CUSTOMERS_TABLE."      AS et
  JOIN ".DB_RELATIONS_TABLE." AS rel
  ON (et.id =  rel.EID)
  JOIN ".DB_EVENT_TABLE."  AS loc
  ON (loc.Location_ID = rel.Location_ID)
  GROUP BY et.Art,  et.Kategorie, et.ID, et.Event 
       ";

但不能肯定的是,在你提出问题的信息之后,你实际上就是这样。

如果您的查询返回:

 Name Event
 max  Sports
 max  Food
 max  Cinema
 tom  Food
 tom  Sports

您可以将其包装在上面的简单组concat示例中:

SELECT Name, GROUP_CONCAT(Event)
FROM (Your query) as sub
GROUP BY Name