MySQL选择行上的条件满足2次或更多次但显示两个或更多结果的事物

时间:2014-04-21 01:38:41

标签: mysql sql join

如果我使用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等等)但仍然可以!

1 个答案:

答案 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;