按ID将mysql结果组合在一起

时间:2013-06-24 23:59:48

标签: php mysql

我有一个访问我网站的页面访问数据库,每次访问都有一个唯一的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

3 个答案:

答案 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()等。

您必须明确提及您希望在结果中看到的列,以及如果应将多个源行混合到一个结果行中的结果类型。