thinkphp的数据库查询

假如有一个表user(id,user,isMember),里面一个字段isMember(标志该用户是否会员,1为会员0为普通用户),现在有一个需求,我要推荐用户(目标是会... 假如有一个表user(id,user,isMember),里面一个字段isMember(标志该用户是否会员,1为会员 0为普通用户),现在有一个需求,我要推荐用户(目标是会员,数量30个),但如果user表中(isMember=1)会员数量不足30个,就要从普通用户里补上。
现在刚好会员数量不足30个,那需要从普通用户里补上的,但我想每次请求,获取全部会员数量(假设只有20个)并随机地抽取用户数量(10个),必须分页显示,请在thinkphp的框架上实现以上操作(我主要是sql不知如何写)
展开
 我来答
飲鴆_止渴
2013-11-27 · TA获得超过1232个赞
知道小有建树答主
回答量:400
采纳率:0%
帮助的人:540万
展开全部
SELECT * FROM ((SELECT * FROM user as is_m WHERE is_m.isMember = '1') UNION ALL (SELECT * FROM user as not_is WHERE not_is.isMember = '0' ORDER BY RAND() LIMIT 10 )) as t ORDER BY t.id DESC LIMIT 10, 20"

这是雏形,你可以进行优化。

拆分详解:

  1. (SELECT * FROM user as is_m WHERE is_m.isMember = '1') 这个括号中,是查询会员,这个不用多说,你应该明白,至于为什么要加别名,同表多次查询自然要加别名以区分;

  2. (SELECT * FROM user as not_is WHERE not_is.isMember = '0' ORDER BY RAND() LIMIT 10 )这个括号中,是查询非会员,其中ORDER BY RAND() LIMIT 10是关键,它的意思就是从中随机取十个结果;

  3. SELECT * FROM (会员 UNION ALL非会员) as t ORDER BY t.id DESC LIMIT 10,20。这里即用到了联合查询UNION ALL,也用到了子查询,把联合查询的结果作一个结果集,然后从中进行查询,查询这个结果集的时候,使用ORDER BY和LIMIT进行分页处理。

     

以上,就是该语句的详解了,当然,其中也需要你做一些处理。

比如要先进行判断会员数满没满三十个,满了则无需如此,直接使用会员,没满则计算出还差多少个,在查询非会员那里LIMIT 数字才好使用;

至于分页,这个又是另一个问题了,你应该知道怎么分页的。

大庞说故事
2013-11-27 · 正八经儿的讲故事!
大庞说故事
采纳数:123 获赞数:313

向TA提问 私信TA
展开全部
sql:
select * from user order by isMember desc limit 0,30
实现思路:
1、将user表按isMember降序排列,这样会员用户就会排在前面,普通用户排在后面。
2、取查询结果中的前30个,这样如果会员有20个,会全部取出来,后面10个为普通用户。
3、如果还有其他排序条件,自己往里加吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式