我的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
每次计数都失败了!我是以正确的方式解决这个问题还是从根本上做错了?
答案 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;
(修改:更改为左外部联接以处理没有会话访问或每次访问没有搜索的情况)
答案 1 :(得分:0)
查询生成错误,因为查询中未提及列名 操作数应包含1列
并尝试使用 IN