1、查找二度好友(mysql)
好友的好友
(1)自己的好友的好友
(2)不包括自己的好友
(3)好友的好友不包括自己
DROP TABLE IF EXISTS FRIEND;
CREATE TABLE friend(
uid BIGINT NOT NULL COMMENT '用户标识',
friend_uid BIGINT NOT NULL COMMENT '申请加为好友的用户标识',
sys_create_date DATETIME NOT NULL COMMENT '申请时间',
sys_last_update DATETIME NOT NULL COMMENT '更新时间',
state TINYINT NOT NULL COMMENT '好友状态 0 : 删除, 1:申请好友, 2 : 好友',
PRIMARY KEY(uid, friend_uid)
)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT '好友表';
SELECT friend_uid
FROM friend
WHERE state=2 AND uid IN (SELECT friend_uid
FROM friend
WHERE uid=13 AND state=2) # 好友的好友,不包括申请好友
AND friend_uid NOT IN (SELECT friend_uid
FROM friend
WHERE uid=13 ) # 不包括一度好友
AND friend_uid != 13 # 好友的好友不包括自己
LIMIT 6 # limit n,m 表示返回的记录数(n+1,n+m),m=-1 到末尾,n=0时可以省略。
2、实现累积求和

# 简单的方法
set @csum := 0;
select 日期, 净利润, (@csum := @csum + 净利润 ) as 累积利润
from lirun_table;
# 复杂的方法
select 日期,(select sum(利润) from lirun_table ss where ss.日期<= tt.日期) as 累积利润
from lirun_table tt
group by 日期;
SELECT a.日期,a.利润,SUM(lt.利润) AS cum
FROM lirun_table a
JOIN lirun_table lt
ON a.日期 >= lt.日期
GROUP BY a.日期;
# 累积减
ALTER TABLE lirun_table ADD id INT;
alter table lirun_table modify id int auto_increment primary key;
select a.id,a.日期,a.净利润,b.净利润,IFNULL(a.净利润-b.净利润,a.净利润) as cum
from lirun_table a
left join lirun_table b
on a.id = b.id+1
group by a.id;

3、求每个班级的及格率
假设有一个分数表 TScore,包含班级,学号,平均分这3个字段(class, no, score)
现在想求每个班级的及格率(>=60人数/总人数*100)
select Total.class, CONCAT(ROUND(Hit.num / Total.num * 100,2),'%') as pass_rate
from (select class, count(1) as num
from TScore
group by class) Total
left join (select class, count(1) as num
from TScore
where score >= 60
group by class) Hit
on Total.class = Hit.class
版权声明:本文为weixin_41725746原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。