0

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

3 回答 3

1

You have a basic misunderstanding of what GROUP BY is for. It's not for collecting related rows together, it's for combining related rows into one row in the result, when using aggregation functions such as COUNT(), SUM(), and MAX().

To get related rows together in the result, use ORDER BY, making the column you care about the first column in the ordering list, e.g.

ORDER BY visit_id, timedate

If you want to show the visit ID only once in the output, the PHP loop that processes the result should contain something like:

if ($row['visit_id'] != $last_visit_id) {
  $last_visit_id = $row['visit_id'];
  echo "Visit ID: $last_visit_id\n";
}
于 2013-06-25T00:32:57.527 回答
0

由于您已经过滤到某个 visit_id,因此您实际上不必使用 GROUP BY。

于 2013-06-25T00:06:46.570 回答
0

您不能简单地按某事分组并且仍然SELECT *。这在 SQL 中没有意义,但 MySQL 不这样认为,并将在 GROUP BY 中未提及或与 COUNT()、MAX()、MIN() 等分组函数一起使用的每一列中返回一个随机结果, GROUP_CONCAT()、SUM() 等。

您必须明确提及您希望在结果中看到的列,以及如果应该将多个源行混合到一个结果行中,则需要哪种结果。

于 2013-06-25T00:06:56.427 回答