首页 > 数据库 >【LeetCode1747. 应该被禁止的 Leetflex 账户】MySQL用户变量编程;尝试维护一个multiset

【LeetCode1747. 应该被禁止的 Leetflex 账户】MySQL用户变量编程;尝试维护一个multiset

时间:2024-01-13 13:12:53浏览次数:32  
标签:count account ip online Leetflex ips LeetCode1747 MySQL id

题目地址

https://leetcode.cn/problems/leetflex-banned-accounts/description/

代码

with t1 as(
    select account_id,ip_address,
    login as tick,
    "login" as mytype
    from LogInfo
    union all
    select account_id,ip_address,
    logout as tick,
    "logout" as mytype
    from LogInfo
)
,
t2 as(
    SELECT 
        t.*,

        # ----只需要改动这里的逻辑,其他不要动-----------
        @prev_online_ips := @online_ips, 
        @search_for := CONCAT(',', t.ip_address) as search_for,
        @first_occurrence := LOCATE(@search_for, @online_ips) as first_occurrence,


        @online_ips := (case when account_id=@prev_account_id then
            (CASE 
            WHEN t.mytype = 'login' THEN CONCAT_WS(',', @online_ips, t.ip_address)
            WHEN t.mytype = 'logout' THEN 

            (CASE
                WHEN @first_occurrence > 0 THEN -- 找到第一个匹配的ip,移除它
                    CONCAT(
                        SUBSTRING(@online_ips, 1, @first_occurrence - 1), 
                        SUBSTRING(@online_ips, @first_occurrence + LENGTH(@search_for))
                    )
                ELSE
                    @online_ips
            END)

            ELSE @online_ips END)
        else (CASE 
            WHEN t.mytype = 'login' THEN CONCAT_WS(',', '', t.ip_address)
            WHEN t.mytype = 'logout' THEN 

            (CASE
                WHEN @first_occurrence > 0 THEN -- 找到第一个匹配的ip,移除它
                    CONCAT(
                        SUBSTRING(@online_ips, 1, @first_occurrence - 1), 
                        SUBSTRING(@online_ips, @first_occurrence + LENGTH(@search_for))
                    )
                ELSE
                    @online_ips
            END)

            ELSE @online_ips END)
        end) AS dummy -- This is a dummy column to update the @online_ips variable

        ,

        @online_count := 
        (case when account_id=@prev_account_id then 
            (CASE 
            WHEN t.mytype = 'login'  THEN  
                (case when FIND_IN_SET(t.ip_address, @online_ips) > 0 and FIND_IN_SET(t.ip_address, @prev_online_ips) = 0
                    then @online_count+1
                    else @online_count
                end)
            WHEN t.mytype = 'logout' THEN
                (case when FIND_IN_SET(t.ip_address, @online_ips) = 0 and FIND_IN_SET(t.ip_address, @prev_online_ips) > 0  
                  then @online_count-1
                    else @online_count
                end)
            ELSE @online_count END)
         else (CASE 
            WHEN t.mytype = 'login'  THEN  1
            WHEN t.mytype = 'logout' THEN 
                (case when FIND_IN_SET(t.ip_address, @online_ips) = 0 and FIND_IN_SET(t.ip_address, @prev_online_ips) > 0  
                    then @online_count-1
                        else @online_count
                end)
            ELSE @online_count END)
        end )
        
        AS online_ip_count

        , @prev_account_id := account_id

        # ----只需要改动这里的逻辑,其他不要动-----------
    FROM 
        (SELECT @online_ips := '', @online_ip_count := 0, @prev_account_id := null) vars,
        (SELECT * FROM t1 ORDER BY account_id asc, tick ASC) t
)


select 
distinct account_id 
from t2
where online_ip_count>=2
order by account_id asc, tick ASC

标签:count,account,ip,online,Leetflex,ips,LeetCode1747,MySQL,id
From: https://www.cnblogs.com/yhm138/p/17962243

相关文章

  • 9 表操作之删除数据 -- MySQL数据库
    如果记录不再需要,则可以用delete命令进行删除。1.删除数据a.语法mysql>deletefrom表名[where条件];b.实例实例: --在emp中将ename为'dony'的数据全部删除。 代码:mysql>deletefromempwhereename='dony';2.删除多表数据a.语法mysql>delete表1,......
  • Mysql时间常用函数
    查看当前系统的时间  select sysdate();  selectcurdate(),now(),DATE_FORMAT('2024-01-03','%Y-%m-%d') 2024-01-13|2024-01-1311:32:28|2024-01-03 目前常用的就curdate now  DATE_FORMAT('2024-01-03','%Y-%m-%d')  oracle的s......
  • oracle和mysql语句的异同
    Oracle和MySQL是两个流行的关系型数据库管理系统,它们都有SQL(结构化查询语言)作为主要的查询语言。尽管它们共享许多基本的SQL功能,但它们之间也存在一些关键的差异。以下是一些Oracle和MySQL语句的异同点:数据类型:相同点:两者都有整数、浮点数、字符、日期等数据类型。不同点:Oracle有一......
  • MySQL一键安装Shell脚本的实现
    本文主要介绍了MySQL一键安装Shell脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧−目录一、脚本说明1、linux系统版本2、MySQL版本3、运行方式二、脚本内容一、脚本说明1、linux系统版本EL6,EL7,EL8,......
  • 【Leetcode1949. 坚定的友谊】使用MySQL在无向图中寻找{"CompleteTripartite", {1, 1,
    目录题目地址思路代码MySQL代码等效Cypher查询(未验证)题目地址https://leetcode.cn/problems/strong-friendship/思路就是在无向图中寻找这个pattern:(*Mathematica*)GraphData[{"CompleteTripartite",{1,1,3}}]SQL写还是比较麻烦。更加复杂的查询还是建议把数据迁......
  • 【LeetCode 2142. 每辆车的乘客人数 I】乘客到站等车,车到站载客。MySQL用户变量编程完
    题目地址https://leetcode.cn/problems/the-number-of-passengers-in-each-bus-i/description/思路将所有关键时刻作为tick。(同一时刻车和人同时到,默认人在车前到)之后按照tick升序,使用MySQL用户变量编程完成计算逻辑。输出结果。代码withticksas(selectarrival_tim......
  • mysql8.0窗口函数
    2、新特性1:窗口函数2.1、使用窗口函数前后对比假设我现在有这样一个数据表,它显示了某购物网站在每个城市每个区的销售额:CREATETABLEsales(idINTPRIMARYKEYAUTO_INCREMENT,cityVARCHAR(15),countyVARCHAR(15),sales_valueDECIMAL);INSERTINTOsales(city,county......
  • 简单易用的 MySQL 官方压测工具
    一、MySQL自带的压力测试工具Mysqlslapmysqlslap是mysql自带的基准测试工具,该工具查询数据,语法简单,灵活容易使用.该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比较。mysqlslap为mysql性能优化前后提供了直观的验证依据......
  • GaussDB(for MySQL) RegionlessDB发布:全球数据库技术
    本文分享自华为云社区《GaussDB(forMySQL)RegionlessDB发布:全球数据库技术》,作者:GaussDB数据库。1.技术背景对于一些典型行业,如跨境电商和大型互联网企业,其业务往往遍及世界各地。在当今中资出海的浪潮下,客户业务全球化部署诉求对传统的数据库部署形态提出了挑战。过去客户主要......
  • Ubuntu系统安装mysql
    1.查看有没有安装mysql dpkg-l|grepmysql2.更新ubantu包索引sudoaptupdate 3.安装mysqlsudoapt-getinstallmysql-server 4.初始化环境sudomysql_secure_installation  5.查看mysql服务状态systemctlstatusm......