【问题标题】:MySQL to return unique rows of members who have visited one page but not in anotherMySQL返回访问过一个页面但未访问另一个页面的成员的唯一行
【发布时间】:2019-12-17 20:14:59
【问题描述】:

数据库存储每次“访问”的“电子邮件”和“页面”。我想找到访问过“结帐”页面的人的电子邮件,可能很多次,但没有访问过“谢谢”页面。即废弃的手推车;他们到了结帐,但从未完成购买以进入“谢谢”页面。

我要返回列表:

bob@bob.com  
di@di.com

作为仅有的两封未访问“谢谢”页面的电子邮件。

我知道它一定是访问表上的某种自加入,但我很挣扎。 这是数据:

visit_id | visit_email     | visit_page
----------------------------------------
1        | alice@alice.com | checkout
2        | alice@alice.com | Thankyou
3        | alice@alice.com | checkout
4        | alice@alice.com | checkout
5        | bob@bob.com     | checkout
6        | chuck@chuck.com | checkout
7        | chuck@chuck.com | Thankyou
8        | di@di.com       | checkout
9        | bob@bob.com     | checkout



CREATE TABLE `visit` (
  `visit_id` int(11) NOT NULL,
  `visit_email` varchar(80) NOT NULL,
  `visit_page` varchar(80) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `visit`
--

INSERT INTO `visit` (`visit_id`, `visit_email`, `visit_page`) VALUES
(1, 'alice@alice.com', 'checkout'),
(2, 'alice@alice.com', 'Thankyou'),
(3, 'alice@alice.com', 'checkout'),
(4, 'alice@alice.com', 'checkout'),
(5, 'bob@bob.com', 'checkout'),
(6, 'chuck@chuck.com', 'checkout'),
(7, 'chuck@chuck.com', 'Thankyou'),
(8, 'di@di.com', 'checkout'),
(9, 'bob@bob.com', 'checkout');


【问题讨论】:

  • 你尝试了什么?

标签: mysql subquery left-join self-join


【解决方案1】:

你可以用这个:

select distinct v.visit_email 
from visit v 
where (
    select count(*) 
    from visit c 
    where c.visit_email = v.visit_email 
    and c.visit_page = 'Thankyou'
) = 0

输出:

bob@bob.com
di@di.com

【讨论】:

    【解决方案2】:

    我想查找访问过“结帐”页面的人的电子邮件,可能很多次,但没有访问过“谢谢”页面

    一种选择是使用聚合和带有having 子句的过滤器:

    select visit_email
    from visit
    group by visit_email
    having
        max(visit_page = 'checkout') = 1
        and max(visit_page = 'Thankyou') = 0
    

    【讨论】:

      猜你喜欢
      • 2018-12-16
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 2017-07-20
      • 1970-01-01
      相关资源
      最近更新 更多