如果我使用GROUP BY
,那么每组只会获得1行。例如
Sessions table: SessionId (other things)
Actions table: ActionId, SessionId, (other things)
使用:
SELECT S.*, A.* FROM ActionList A JOIN SessionList S ON A.SessionId
=S.SessionId
WHERE 1 /*various criteria to filter*/
ORDER BY S.SessionId DESC, ActionId DESC;
因此向我展示了最近的会议。现在我想只查看包含2个或更多操作的会话。
如果我使用GROUP BY A.SessionId
,那么我可以获得COUNT(ActionId)
并使用HAVING
仅查看具有所需数量的行,但我不会获得两行(或更多行),只是一个。
我怀疑我可以JOIN
使用带有SessionIds的表和操作ID计数来做到这一点,但我对连接相当新(我可以通过子查询来执行此任务ANY
)。
如果视图有帮助,我会创建一个表单视图:
SELECT SessionId, COUNT(*) FROM Actions GROUP BY SessionId;
或者将它放在方括号中JOIN
(但我承认我必须循环3个表连接)
最好的方法是什么?
这也是"外键"参加进来?这可能会阻止"歧义错误"如果我没有资格获得SessionId,我会得到。我因为害怕TRIGGER
而避免使用它们,我也不知道JOIN并且直到最近才使用子查询。我已经意识到避免添加帮助的东西是愚蠢的。
另外我对加入非常胆小,因为我知道它的作用,最坏的情况。如果我在一个有m行的表上加入,而另一个用n加入,我最后得到m * n行。那可能非常大!我正在处理大型表(如:架构不适合RAM大)所以这非常可怕。我知道MySQL可以很好地优化(能够将内容从HAVING
移到WHERE
等等)但仍然可以!
答案 0 :(得分:1)
如果您想查看包含两个或更多操作的会话,请使用连接:
select sl.*
from SessionList sl join
(select SessionId, count(*) as cnt
from Actions
group by SessionId
) a
on sl.SessionId = a.SessionId and cnt > 1;