我有一个访问我网站的页面访问数据库,每次访问都有一个唯一的ID,但如果访问者在访问期间查看多个页面,则每个页面视图都会作为访问ID进行分享。
下面的表格结构,
`id` int(10) NOT NULL AUTO_INCREMENT,
`client_id` int(11) NOT NULL,
`url` text NOT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`timedate` datetime NOT NULL,
`visit_id` varchar(100) NOT NULL,
`url1` varchar(255) NOT NULL,
`page_time` time NOT NULL,
`type` varchar(50) NOT NULL,
下面是我页面截图的链接,正如您将看到所有访问都列在单个框中的那一刻,我想要做的是将结果组合在一起,共享相同的visit_id。
http://www.lst-technologies.co.uk/pageviews.html
我尝试过以下代码:
SELECT * FROM $tableName WHERE client_id='$client_id' AND visit_id ='$id' GROUP BY visit_id LIMIT $start, $limit
但这只是对结果进行分组,但只显示一个条目。
当前显示的代码
SELECT * FROM $tableName WHERE client_id='$client_id' AND visit_id ='$id' LIMIT $start, $limit
答案 0 :(得分:1)
您对GROUP BY
的含义存在基本的误解。它不是用于收集相关的行,而是用于在使用COUNT()
,SUM()
和MAX()
等聚合函数时将相关行合并到结果中的一行。
要在结果中一起获取相关的行,请使用ORDER BY
,使您关心的列符合排序列表中的第一列,例如
ORDER BY visit_id, timedate
如果要在输出中仅显示访问ID一次,处理结果的PHP循环应包含以下内容:
if ($row['visit_id'] != $last_visit_id) {
$last_visit_id = $row['visit_id'];
echo "Visit ID: $last_visit_id\n";
}
答案 1 :(得分:0)
由于您已经过滤到某个visit_id,因此您不必使用GROUP BY。
答案 2 :(得分:0)
您不能简单地按某种方式进行分组,仍然SELECT *
。这在SQL中没有意义,但MySQL认为不然,并且会在GROUP BY中未提及的每一列中返回一个随机结果,或者与COUNT(),MAX(),MIN()等分组函数一起使用, GROUP_CONCAT(),SUM()等。
您必须明确提及您希望在结果中看到的列,以及如果应将多个源行混合到一个结果行中的结果类型。