本文目录一览:
- 1、ThinkPHP mode 怎么实现模糊查询
- 2、thinkphp利用模型关联来做关联统计
- 3、thinkphp3.2 子查询
- 4、Thinkphp数据查询group分组如何取每组的最新记录
- 5、thinkphp的数据库查询
- 6、在thinkphp中想用not in和子查询组合一个sql,这个该怎么写?
ThinkPHP mode 怎么实现模糊查询
复合查询相当于封装了一个新的查询条件,然后并入原来的查询条件之中,所以可以完成比较复杂的查询条件组装。 例如:
$where['name'] = array('like', '%thinkphp%');$where['title'] = array('like','%thinkphp%');$where['_logic'] = 'or';$map['_complex'] = $where;$map['id'] = array('gt',1);
查询条件是
( id 1) AND ( ( name like '%thinkphp%') OR ( title like '%thinkphp%') )
复合查询使用了_complex作为子查询条件来定义,配合之前的查询方式,可以非常灵活的制定更加复杂的查询条件。 很多查询方式可以相互转换,例如上面的查询条件可以改成:
$where['id'] = array('gt',1);$where['_string'] = ' (name like "%thinkphp%") OR ( title like "%thinkphp") ';-thinkphp子查询
最后生成的SQL语句是一致的。
thinkphp利用模型关联来做关联统计
有些时候,并不需要获取关联数据,而只是希望获取关联数据的统计。
例如用户模型与用户充值订单模型,
想知道用户充值了多少次,则用 withCount ,
想知道用户充值了多少钱,则用 withSum ,
想知道充值的最大一笔的金额用 withMax ,
想知道充值的最小一笔的金额用 withMin ,
想知道充值的平均的金额 withAvg
User模型用增加一对多模型关联
控制器中调用,关联统计功能会在模型的对象属性中自动添加一个以“关联方法名+_方法”(支持自定义)为名称的动态属性来保存相关的关联统计数据。
以上方法都是默认用了子查询,如果想
withCount()
生成的sql语句是
如果不用子查询,withCount()第二个参数填false,withSum,withMax,withMin,withAvg第三个参数填false,
生成的sql语句是
thinkphp3.2 子查询
直接上代码
[php] view plain copy
$product_info = M('product_info as info');
[php] view plain copy
$productinfo = $product_info-join('left join c_price_comment as comment on info.sku=comment.sku')-where($where)-order('info.create_time desc')-field('info.*,comment.comment_count')-buildSql(); -thinkphp子查询
$list = M()-table($productinfo.' a')-order(' '.$order.'')-group('sku ')-limit($limit)-select();
buildSql方法后不会进行实际的查询操作,而只是生成该次查询的SQL语句
Thinkphp数据查询group分组如何取每组的最新记录
本人用ThinkPHP3.2,今天正在开发一个需要分组显示的功能,可是从数据库中把相应数据读取后直接用group分组,结果每组显示的是最老的记录,我的需求是要显示每组的最新记录。在网上大搜一翻后,未果,本人决定自行研究,现将方法记录于此以防遗忘。-thinkphp子查询
其实很简单,以供就两步:
第一步:
将符合条件的数据全部取出,暂不用group分组,作为子查询:
[php] view plain copy
$subQuery = $model-field('id,name')-table('tablename')-where($where)-order('time desc')-select(false);-thinkphp子查询
第二部:
利用子查询进行查询分组
[php] view plain copy
$model-table($subQuery.' a')-group('field')-select();span style="font-family: Arial, Helvetica, sans-serif;" /span-thinkphp子查询
好了,思路就是这样。希望对大家有帮助!
thinkphp的数据库查询
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"-thinkphp子查询
这是雏形,你可以进行优化。
拆分详解:
(SELECT * FROM user as is_m WHERE is_m.isMember = '1') 这个括号中,是查询会员,这个不用多说,你应该明白,至于为什么要加别名,同表多次查询自然要加别名以区分;-thinkphp子查询
(SELECT * FROM user as not_is WHERE not_is.isMember = '0' ORDER BY RAND() LIMIT 10 )这个括号中,是查询非会员,其中ORDER BY RAND() LIMIT 10是关键,它的意思就是从中随机取十个结果;-thinkphp子查询
SELECT * FROM (会员 UNION ALL非会员) as t ORDER BY t.id DESC LIMIT 10,20。这里即用到了联合查询UNION ALL,也用到了子查询,把联合查询的结果作一个结果集,然后从中进行查询,查询这个结果集的时候,使用ORDER BY和LIMIT进行分页处理。-thinkphp子查询
以上,就是该语句的详解了,当然,其中也需要你做一些处理。
比如要先进行判断会员数满没满三十个,满了则无需如此,直接使用会员,没满则计算出还差多少个,在查询非会员那里LIMIT 数字才好使用;
至于分页,这个又是另一个问题了,你应该知道怎么分页的。
在thinkphp中想用not in和子查询组合一个sql,这个该怎么写?
$model = M("b");
$subQuery = $model-field('id')-where($map)-buildSql();
$modle2 = M("a");
$List = $model2-where('id not in '.$subQuery)-select();
这是thinkphp3.0的新特性貌似