MySQL获取相关表的计数

时间:2015-06-02 10:47:01

标签: mysql sql

我的SQL不仅有点生疏,而且我无法让它工作,所以任何帮助都会非常感激。

我有三张桌子:

sessions
---------------
id

session_visits
---------------
id | session_id

searches
---------------
id | session_visit_id

我希望获得所有会话的列表,其中包含每次会话的总访问和搜索,这些会话由session_visits表链接。我可以很好地访问,但我也无法获得每个会话的搜索总数。

到目前为止我已经

SELECT *,(SELECT Count(*)    
          FROM session_visits    
          WHERE session_id = sessions.id) AS num_visits, 
         (SELECT Count(*)    
          FROM searches    
          WHERE session_visit_id = (SELECT * FROM session_visits    
                                    WHERE session_id = sessions.id)) AS total_searches
FROM sessions

每次计数都失败了!我是以正确的方式解决这个问题还是从根本上做错了?

2 个答案:

答案 0 :(得分:1)

您可以在一个查询中执行此操作,方法是将3个表连接在一起,然后使用聚合COUNT DISTINCT(以消除重复)和COUNT来获取子孙的总行数分别按Sessionid分组的行。

SELECT s.id AS SessionId, COUNT(DISTINCT sv.id) AS SessionVisits, COUNT(sr.ID) AS Searches
FROM sessions s
  LEFT JOIN session_visits sv
  ON s.id = sv.session_id
  LEFT JOIN searches sr
  ON sr.session_visit_id = sv.id
GROUP BY s.id;

SqlFiddle here

修改:更改为左外部联接以处理没有会话访问或每次访问没有搜索的情况)

答案 1 :(得分:0)

查询生成错误,因为查询中未提及列名    操作数应包含1列

并尝试使用 IN