记录一段mysql代码

SELECT f . * , tmp.userid, tmp.cishu
FROM fx_user f, (

SELECT a.id, b.userid AS userid, COUNT( * ) AS cishu
FROM `fx_user` AS a
LEFT JOIN `fx_plan` AS b ON a.id = b.userid
AND b.fxtype =0
GROUP BY a.id
)tmp
WHERE f.id = tmp.id
AND priority =1
ORDER BY id ASC
LIMIT 0 , 50

 通过括号内左连接查询,得到一个结果集,这个结果集可以看作是一张虚拟表tmp:

 (

SELECT a.id, b.userid AS userid, COUNT( * ) AS cishu
FROM `fx_user` AS a
LEFT JOIN `fx_plan` AS b ON a.id = b.userid
AND b.fxtype =0
GROUP BY a.id
)tmp

 得到包含左表user表的全部行数据(tmp),类似于

1------a

2------b

3------c

4------NULL

即,左表全部列出,右边不存在的信息用null填空。

然后再用          select * from 表1,表2 where 表1.字段 = 表2.字段     这种多表查询方式取得自己想要的结果。

 

 

———————————————————分割线—————————————————————————

今天再次看上次的查询,发现用这种临时表的方式,搞得太复杂了,自己对查询还是掌握太少了。百度一阵子,又找到以下更加简单的方法:

1、次数为0,是一种情况
*****次数为0时,类型不选则用

无论15分钟还是随机都没有分享的

SELECT * from `fx_user` where id NOT IN (SELECT userid FROM `fx_plan` where fxtype=2 or fxtype=1 group by userid)

  

 

次数为0,类型选择15分钟,则用
15分钟没有分享的

SELECT * from `fx_user` where id NOT IN (SELECT userid FROM `fx_plan` where fxtype=1 group by userid)

  

次数为0,类型选择随机,则用

随机没有分享的

SELECT * from `fx_user` where id NOT IN (SELECT userid FROM `fx_plan` where fxtype=2 group by userid)

  


姓名和级别后面追加查询条件 and 即可

==================================
2、次数不为0,是一种情况
*****如果选择 随机 ,且次数为2,这个比较麻烦点

select * from `fx_user` f ,(SELECT userid,count(*) as cishu FROM `fx_plan` where fxtype=2 group by userid) tmp where f.id=tmp.userid and tmp.cishu=2

  

*****如果选择 随机 ,且次数为1,

select * from `fx_user` f ,(SELECT userid,count(*) as cishu FROM `fx_plan` where fxtype=2 group by userid) tmp where f.id=tmp.userid and tmp.cishu=1

  

姓名和级别后面追加查询条件 and 即可

 

==================================
发现用 having 取代 where 后,就可以用 count 作为查询条件了 (HAVING要放到最后)

SELECT * from `fx_user` where id IN (SELECT userid FROM `fx_plan` where fxtype=2 group by userid HAVING count(userid)=2 )

  

这样一来,1,2两种情况就可以合二为一了。

 

posted @ 2023-06-13 16:46  充实地生活着  阅读(20)  评论(0)    收藏  举报