从2个表中分组2个参数

时间:2013-04-29 10:34:23

标签: sql group-by

我在这个网站上的第一个问题很简单。

是否可以将SQL GROUP BY与2个表中的2个参数一起使用

SELECT 
  DISTINCT COUNT(a.id), 
  b.id 
FROM 
  table a 
  LEFT JOIN table b 
GROUP BY a.id, b.id

我添加完整的请求

SELECT DISTINCT e.PkID, e.LocID, e.LocationName, l.Name, e.LocationCity, l.City, e.Title, l.Descript, e.Description, e.LocID, e.LocationName, e.StartDate, e.StartTime, e.EndTime, e.TBD, c.CategoryName, Count(e.PkID), ec.CategoryID, l.PkID
                FROM events e
                        LEFT JOIN eventcategories ec ON (ec.EventID = e.PkID)
                        LEFT JOIN categories c ON (ec.CategoryID = c.PkID)
                        LEFT JOIN locations l ON (e.LocID = l.PkID)
                    WHERE DATE(StartDate) >= DATE(CURDATE()) AND l.IsActive = 1
                    GROUP BY " . $Group . "
                    ORDER BY " . $Order . "
                    ;

$Group = $Order = 'l.Name';

我显示了几个l.Name,每个都有,计算的事件数量(e.PKiD)

每个事件都有一个或多个类别,当我只有一个类别时,它是正确的计数,但是当我在一个位置有3个类别时,它会计算3个而不是1个(事件)

2 个答案:

答案 0 :(得分:0)

要按a.id计算b.id,您可以使用以下内容:

SELECT  b.id
,       count(a.id)
from    TableB b
left join
        TableA a
on      a.bid = b.id

其中TableA.bid是引用TableB(id)的外键。

答案 1 :(得分:0)

虽然你没有提到你的查询应该做什么,但很难猜到。您的问题的一般答案是“是的,您可以通过两个参数GROUP BY”。这将创建通过所有可能的a.idb.id对的表。这是你问题的答案。

现在,回到您的查询,这是错误的(只要您不解释您实际想要用它做什么),因为按a.id分组将始终将COUNT(a.id)设为0或1和DISTINCT将仅选择COUNT(a.id)的唯一值;我怀疑这是预期的行为。

编辑:使用新查询编辑问题后。现在我认为你根本不需要两个GROUP BY。您正在多次计算每个事件,因为在加入categories时,您会获得相同事件ID的多个记录。你只需要有一个独特的计数:

COUNT(DISTINCT e.PkID) .... GROUP BY " . $Group . "