我在这个网站上的第一个问题很简单。
是否可以将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个(事件)
答案 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.id
和b.id
对的表。这是你问题的答案。
现在,回到您的查询,这是错误的(只要您不解释您实际想要用它做什么),因为按a.id
分组将始终将COUNT(a.id)
设为0或1和DISTINCT
将仅选择COUNT(a.id)
的唯一值;我怀疑这是预期的行为。
编辑:使用新查询编辑问题后。现在我认为你根本不需要两个GROUP BY
。您正在多次计算每个事件,因为在加入categories
时,您会获得相同事件ID的多个记录。你只需要有一个独特的计数:
COUNT(DISTINCT e.PkID) .... GROUP BY " . $Group . "