【问题标题】:MySQL - Correct approach event countingMySQL - 正确的方法事件计数
【发布时间】:2013-08-28 12:02:12
【问题描述】:

我想列出具有特定事件计数的用户,但我对采用哪种方法感到困惑。

这是数据库表:

CREATE TABLE `event` (
  `event_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `visitor_id` int(11) DEFAULT NULL,
  `key` varchar(200) DEFAULT NULL,
  `value` text,
  `label` varchar(200) DEFAULT '',
  `datetime` datetime DEFAULT NULL,
  PRIMARY KEY (`event_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;


INSERT INTO `event` (`event_id`, `visitor_id`, `key`, `value`, `label`, `datetime`)
VALUES
    (1, 1, 'LOGIN', NULL, '', NULL),
    (2, 2, 'LOGIN', NULL, '', NULL),
    (3, 1, 'VIEW_PAGE', 'HOTEL', '', NULL),
    (4, 2, 'VIEW_PAGE', 'HOTEL', '', NULL),
    (5, 1, 'PURCHASE_HOTEL', NULL, '', NULL);

CREATE TABLE `visitor` (
  `visitor_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `datetime` datetime DEFAULT NULL,
  PRIMARY KEY (`visitor_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

INSERT INTO `visitor` (`visitor_id`, `datetime`)
VALUES
    (1, NULL),
    (2, NULL);

这是我的方法:

SELECT DISTINCT
    t1.`visitor_id`
FROM
    `visitor` t1

JOIN `event` t2 on t1.visitor_id = t2.visitor_id AND t2.`key` = 'LOGIN'
JOIN `event` t3 on t1.visitor_id = t3.visitor_id AND t3.`key` = 'VIEW_PAGE' AND t3.`value` = 'HOTEL'
WHERE ( SELECT COUNT(*) FROM `event` WHERE `event`.`key` = 'PURCHASE_HOTEL' ) > 0

这应该只列出访客 1,但它实际上也列出了没有 PURCHASE_HOTEL 事件的访客 2。

您可以想象,对于每个特定情况,都会有更多的“规则”,例如所有 JOIN 事件。我们能以某种方式纠正和改进这个问题吗?

奖励: 这种方法叫什么名字?

【问题讨论】:

    标签: mysql join subquery self-join


    【解决方案1】:

    我认为这是一个“set-within-sets”查询。对于这种类型的查询,我喜欢使用带有 having 子句的聚合。以下检查您正在寻找的三个条件:

    select visitor_id
    from event e
    group by visitor_id
    having sum(e.key = 'LOGIN') > 0 and
           sum(e.key = 'VIEW_PAGE' and e.value = 'HOTEL') > 0 and
           sum(e.key = 'PURCHASE_HOTEL') > 0;
    

    having 子句中的第一个条件计算LOGIN 记录的数量,当至少找到一条时为真。 (如果您想要一个,请将> 0 更改为= 0。)

    第二个条件检查酒店页面的查看情况。

    第三个统计酒店购买次数。

    【讨论】:

    • 非常感谢。我会玩这个。我应该继续阅读什么以了解有关此技术的更多信息?我应该阅读“拥有”吗?
    • @HerrK 。 . .了解group byhaving 是从哪里开始。这是使用它们的一个微妙之处。不过,稍加练习就值得大量学习。
    • @HerrK 。 . .我碰巧喜欢我写的书,尤其是“使用 SQL 和 Excel 进行数据分析”。你可以在亚马逊上查。
    • 非常感谢@Gordon Linoff 先生
    猜你喜欢
    • 2019-07-16
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    相关资源
    最近更新 更多