0

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

是否可以使用GROUP BY来自 2 个表的 2 个参数的SQL

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,每个 l.Name 都统计了组织的事件数(e.PKiD)

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

4

2 回答 2

0

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

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

TableA.bid引用的外键在哪里TableB(id)

于 2013-04-29T10:36:32.577 回答
0

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

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

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

COUNT(DISTINCT e.PkID) .... GROUP BY " . $Group . "
于 2013-04-29T14:00:40.370 回答