记录一段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两种情况就可以合二为一了。

浙公网安备 33010602011771号