文章目录

  • 前言
  • 一、题目:好友推荐
  • 二、代码块
    • 1.源代码
    • 2.SQL分解

前言

本题主要分享一下结合mysql.help_topic 这张系统表做列转行的一些巧妙的解题思想。


一、题目:好友推荐

1、 两人不是好友,但有共同好友,可以相互推荐(共同好友有n个,推荐指数为n)
2、例如:小明和小王不是好友,但是却有公共的好友小孙,因此可以将小明推荐给小王,也可以将小王推荐给小明
3、代码如下:

create table user_friends(user varchar(5),friends text
);insert into user_friends(user,friends)values
('小明','小张,小李,小孙'),
('小张','小明,小李'),
('小李','小张,小明,小孙'),
('小孙','小明,小李,小王'),
('小王','小孙');

4、需求结果展示:

-- 原表
+------+----------------+
| user | friends        |
+------+----------------+
| 小明 | 小张,小李,小孙 |
| 小张 | 小明,小李      |
| 小李 | 小张,小明,小孙 |
| 小孙 | 小明,小李,小王 |
| 小王 | 小孙           |
+------+----------------+
-- 结果展示
+-------------+----------+
| 互相推荐    | 推荐指数 |
+-------------+----------+
| 小孙<->小张 | 2        |
| 小明<->小王 | 1        |
| 小李<->小王 | 1        |
+-------------+----------+

二、代码块

1.源代码

代码如下(先贴sql,大家自己思考一下,后面再分解思想):

-- 1、为了方便 创建一张视图
select view V_friends
ASselectuser,substring_index(substring_index(U.friends,',',M.help_topic_id+1),',',-1)friendfromuser_friends U,mysql.help_topic MwhereM.help_topic_id<=length(U.friends)-length(replace(U.friends,',',''))-- 2、
selectconcat(if(A.user<B.user,A.user,B.user),'<->',if(A.user>B.user,A.user,B.user))互相推荐,round(count(1)/2) as 推荐指数
fromV_friends A
cross joinV_friends B
onA.user!=B.user andA.friend=B.friend andA.user not in (select friend from V_friends where user=B.user)
group by互相推荐
order by推荐指数 DESC;

2.SQL分解

代码如下(示例):

-- user_friends 表和 mysql.help_topic表做笛卡尔积
-- where 条件决定了mysql.help_topic 的行数-- 如何决定行数???
select user,friends,help_topic_id
from user_friends,mysql.help_topic
where help_topic_id<5
order by user,friends;-- 根据user_friends 中每行friends列值中逗号的数量来决定mysql.help_topic的行数
selectuser,help_topic_id
fromuser_friends U,mysql.help_topic M
whereM.help_topic_id<=length(U.friends)-length(replace(U.friends,',',''))-- 通过笛卡尔积后的每行friends列 和本行的 help_topic_id 值配合提取和help_topic_id对应的好友名
select view V_friends
ASselectuser,substring_index(substring_index(U.friends,',',M.help_topic_id+1),',',-1)friendfromuser_friends U,mysql.help_topic MwhereM.help_topic_id<=length(U.friends)-length(replace(U.friends,',',''))-- 可视化展示
selectconcat(if(A.user<B.user,A.user,B.user),'<->',if(A.user>B.user,A.user,B.user))互相推荐,round(count(1)/2) as 推荐指数
fromV_friends A
cross joinV_friends B
onA.user!=B.user andA.friend=B.friend andA.user not in (select friend from V_friends where user=B.user)
group by互相推荐
order by推荐指数 DESC;

好友推荐(列转行,help_topic_id)相关推荐

  1. MYSQL 列转行方法

    MYSQL 列转行方法 目标 上周遇到个业务场景,要求把一列中用分隔符连接的数据,通过分隔符转多行,形如: 转为 准备 表结构 CREATE TABLE `t_tag` (`id` int NOT N ...

  2. oracle行转列逗号分隔,Oracle逗号分隔列转行实现方法

    那么,现在如果给出一个权限编号,要去检索出用后这个权限的用户集合,就会需要在逗号分隔的多个权限编号中去匹配给出的这个权限编号.如果使用like去做,一则效率不高,二则匹配不精确.因此用到了逗号分隔列转 ...

  3. oracle 行转列的sql,Oracle行转列、列转行的Sql语句总结

    目录结构如下: 行转列 列转行 [一].行转列 1.1.初始测试数据 表结构:TEST_TB_GRADE sql代码 create table TEST_TB_GRADE ( ID NUMBER(10 ...

  4. 数据库:SQLServer 实现行转列、列转行用法笔记

    在许多的互联网项目当中,报表开发是整个项目当中很重要的一个功能模块.其中会有一些比较复杂的报表统计需要行转列或者列转行的需求.今天给大家简单介绍一下在SQLServer当中如何使用PIVOT.UNPI ...

  5. Oracle的列转行问题

    Oracle的列转行问题 Oracle中使用语句将行数据转换称不同的列表示,或者将不同的列数据写到同一列的不同行上的行列转换问题是一个非常传统的话题. 网络上流传了很多将行数据转换称列数据的方法和应用 ...

  6. hive 行转列和列转行的方法_面试常考!SQL行转列和列转行

    关注上方"数据挖掘工程师",选择星标,关键时间,第一时间送达!行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SE ...

  7. as cast float server sql_面试常考!SQL行转列和列转行

    来源:CSDN 作者:潇湘隐者 原文地址:www.cnblogs.com/kerrycode/archive/2010/07/28/1786547.html 大家好,我是小五 今天和大家分享的内容是关 ...

  8. oracle unpivot 索引_Oracle 行转列pivot 、列转行unpivot 的Sql语句总结

    这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str from ap ...

  9. matlab 列转行,postgresql 行转列,列转行后加入到一个整体数据

    这里行转列的基本思想就是使用max,因为其他列下面都是NULL,所以可以Max最后就只能得到有值的这行 普通的查询: SELECT icd , case when (ROW_NUMBER() OVER ...

最新文章

  1. 通过页面埋点做监控却不影响性能?解密ARMS前端监控数据上报技术内幕
  2. 线程调度、公平锁和非公平锁、乐观锁和悲观锁、锁优化、重入锁
  3. 485转换器产品类型介绍
  4. 【Kafka】kafka SSL close message 远程主机被迫关闭了一个连接
  5. 入门指南_Spring Boot2: 快速入门指南
  6. 飞机大战 雷霆战机 打字小游戏 java小游戏设计(提供源代码下载)
  7. HS系列USB数据采集卡,及高速多通道数据分析软件详解
  8. win7保护视力的电脑设置
  9. oracle dataguard 日志传输,从alert日志看Oracle 11g DataGuard日志传输
  10. 【板栗糖GIS】bat—怎么删除子文件夹下的同后缀名的数据
  11. java实现二维码的生成和解析包含工具类
  12. 文科生学python简书_文科生Python教程(一)
  13. QQ邮箱账号异常登录
  14. 【JAVA】项目开发团队分配管理软件
  15. 【Ubuntu 1】ubuntu的软件包
  16. 学习记录438@MySQL group by having 报错1054 - Unknown column ‘type’ in ‘having clause’
  17. Python实现阳历转农历功能
  18. 如何将推荐系统与异构数据巧妙结合——专访微软资深研究员谢幸博士
  19. Hive自定义分区器流程
  20. Maya更改路径后找引用失败解决方法

热门文章

  1. Java网络爬虫抓取新浪微博个人微博记录
  2. 直线---科林明伦杯H题
  3. MySQL单表膨胀优化之MyCat分库分表
  4. 为什么建议使用你LocalDateTime,而不是Date?
  5. Python3 解决编码问题: UnicodeEncodeError: 'gbk' codec can't encode character '\xa9' in position
  6. 如何成功搭建一个游戏平台?
  7. 为什么真空中光速是恒定的?
  8. 为什么最大速度是光速
  9. 【从零开始学微服务】01.微服务的过去与现在
  10. 爬取东方求闻史记和东方求闻口授图片