MySQL + CodeIgniter +点击跟踪独特&总点击次数

时间:2012-03-27 04:03:17

标签: php mysql codeigniter

尝试跟踪广告的出站点击次数,但我遇到了构建查询的麻烦,无法编译用户查看和跟踪的所有统计信息。

我有两个表,一个用于保存所有广告,另一个用于跟踪用户的点击次数和基本详细信息。 ip地址,时间戳,用户代理。

我需要提取所有map_advertisements信息以及基于IP地址的唯一点击,以及基于map_advertisements.id的总点击次数,以便在包含行的表格中显示。每个广告1行,其中两列为totalClicks和totalUniqueClicks

除了为每个广告运行三个单独的查询之外,还有更好的方法吗?

我正在使用MySQL5 PHP 5.3和CodeIgniter 2.1

#example of an advertisements id
$aid = 13;
SELECT
 *
 count(acl.aid)
 count(acl.DISTINCT(ip_address))
FROM
 map_advertisements a
 LEFT JOIN map_advertisements_click_log acl ON a.id = acl.aid
WHERE
 a.id = $aid;

map_advertisements

-- ----------------------------
--  Table structure for `map_advertisements`
-- ----------------------------

DROP TABLE IF EXISTS `map_advertisements`;
CREATE TABLE `map_advertisements` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `youtube_id` varchar(255) NOT NULL,
  `status` int(11) NOT NULL DEFAULT '1',
  `timestamp` int(11) NOT NULL,
  `type` enum('video','picture') NOT NULL DEFAULT 'video',
  `filename` varchar(255) NOT NULL,
  `url` varchar(255) NOT NULL,
  `description` varchar(64) NOT NULL,
  `title` varchar(64) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

map_advertisements_click_log

-- ----------------------------
--  Table structure for `map_advertisements_click_log`
-- ----------------------------
DROP TABLE IF EXISTS `map_advertisements_click_log`;
CREATE TABLE `map_advertisements_click_log` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `aid` int(11) NOT NULL,
  `ip_address` varchar(15) NOT NULL DEFAULT '',
  `browser` varchar(255) NOT NULL,
  `timestamp` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=latin1;

1 个答案:

答案 0 :(得分:4)

问题似乎在您的查询中,表中没有名称为totalClicks的列,并且不正确地使用了distinct关键字。试试这个:

SELECT     *, count(acl.id) as totalClicks, count(DISTINCT acl.ip_address) as uniqueClicks
FROM       map_advertisements a
LEFT JOIN  map_advertisements_click_log acl ON a.id = acl.aid
WHERE      a.id = $aid;