2015-06-02 54 views
1

我的SQL不仅仅是有点生疏,而且我在解决这个问题时遇到了困难,所以任何帮助都将不胜感激。MySQL获取相关表的计数

我有三个表:

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 

这是失败的每个算!我是以正确的方式开展这项工作还是从根本上做错了?

+0

为什么不使用连接?你还需要有一个'group by' –

+0

'SELECT * FROM session_visits'应该是'SELECT id FROM session_visits'。并确保该查询返回单行,否则您需要限制它(例如LIMIT1) – Uriil

+0

生锈?如果您愿意,可以考虑遵循以下简单的两步操作步骤:1.如果您尚未这样做,请提供适当的DDL(和/或sqlfiddle),以便我们可以更轻松地复制问题。 2.如果您尚未这样做,请提供与步骤1中提供的信息相对应的所需结果集。 – Strawberry

回答

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

这真是太棒了,谢谢 - 完全按照我的意愿工作。我正要将你的陈述调整为一个左联合,但你打败了我。多谢。 – Rikkiebags

+0

干杯!我猜'searc.id'是一种独特的pk类型,所以不需要'distinct',但是如果你有更多的子表以这种方式加入,显然重复剂量。 – StuartLC

0

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

并尝试使用IN