mysql关于列转行的想法,以及列求乘集
mysql列转行可以通过concat,先分组然后连接。
show VARIABLES like '%group%'
set @@group_concat_max_len =
select @@group_concat_max_len SELECT GROUP_CONCAT(goods_id), as lzh FROM ts_goods
WHERE ts_goods.cat_id_1 = OR ts_goods.cat_id_2 = OR ts_goods.cat_id_3 =
group by lzh
这里默认的限制是1024字节,可以通过set调整一下。
想到这个的原因是mysql在执行in操作的时候,有时候外层表的数据量巨大,使用in子查询之后不是用外层索引,但是直接的使用字符串拼接会使用索引。
这里还有一个问题,就是in的子查询的where语句没有索引与有索引差别也挺大,使用exlpain extended查看的时候不添加索引会全表扫描外层表。
SELECT DISTINCT order_id FROM ts_order_goods WHERE goods_id in
(
SELECT goods_id FROM ts_goods
WHERE ts_goods.cat_id_1 = OR ts_goods.cat_id_2 = OR ts_goods.cat_id_3 =
)
这里cat_id_1,cat_id_2,cat_id_3,没有索引的话ts_order_goods会all扫描100w行,如果有索引会使用index_marge,只有2k行。
而且上面的语句只是一个大查询的一个子查询,而且大查询的其他条件对这个子查询的优化结果也不同,mysql内部的优化机制挺复杂的,会根据整个执行的语句优化,根据结果集做优化判断。
上面的方法可以用到存储过程里面,这样就不用php去外层查询两次数据库,并拼接了。
CREATE PROCEDURE GetUsersDynamic(WhereCondition varchar(),OrderByExpress varchar())
begin
declare stmt varchar();
if LENGTH(OrderbyExpress)> then
begin
set @sqlstr=concat('select id,name,password,age,getdate(adddate) as AddDate from users where ',WhereCondition,' order by ',OrderByExpress);
end;
else
begin
set @sqlstr=concat('select id,name,password,age,getdate(adddate) as AddDate from users where ',WhereCondition);
end;
end if;
prepare stmt from @sqlstr;
execute stmt;
end;
注意,mysql里面varchar的长度是有限制的,所以不能拼接过长的数据。mysql的in可以转为join,或者exist。
求乘集的方法是临时想的,主要是通过log与power,因为logA+logB = logAB。
SELECT pow(, sum(log2(b))) from
(select as b union select union select ) as t
这样可以得到2*3*4=24
mysql关于列转行的想法,以及列求乘集的更多相关文章
- SQL列转行,行转列实现
在工作中,大家可能会遇到一些SQL列转行.行转列的问题,恰好,我也遇到了,就在此记录一下.此处所用的是SQLServer2008R2. 行转列,列转行,都要预先知道要要处理多少数据,在此我就以三种方案 ...
- oracle 逗号分割,列转行,行转列
SQL代码 列转行 select REGEXP_SUBSTR(a.rolecode ,,l) rolecode from ( select 'a,aa,aaa' rolecode from dual ...
- Spark基于自定义聚合函数实现【列转行、行转列】
一.分析 Spark提供了非常丰富的算子,可以实现大部分的逻辑处理,例如,要实现行转列,可以用hiveContext中支持的concat_ws(',', collect_set('字段'))实现.但是 ...
- hive中的列转行和行转列
1.列转行 1.1 相关函数的说明: concat(string1,string,...) //连接括号内字符串,数量不限. concat_ws(separator,string1,string2,. ...
- SQL 列转行与行转列
假设有张学生成绩表(tb)如下:Name Subject Result张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 物理 94*/ -------------- ...
- 做图表统计你需要掌握SQL Server 行转列和列转行
说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成 ...
- SQLserver行转列与列转行
行表: 行表 姓名 属性 属性值 JACK 身高 180 JACK 体重 80 JACK 年龄 27 TOM 身高 164 TOM 体重 59 TOM 年龄 20 列表: 列表 姓名 身高 年龄 体重 ...
- Sqlserver 列转行 行转列
sqlserver的行转列 列转行问题 行转列:1 使用Case when 方式 CREATE TABLE [StudentScores]( [UserName] NVARCHAR(20), --学生 ...
- Sql Server 列转行 Pivot使用
今天正好做 数据展示,用到了列转行,行转列有多种方式,Pivot是其中的一种,Povit 是sql server 2005以后才出现的功能, 下面的业务场景: 每个月,进货渠道的总计数量[Total] ...
随机推荐
- C# 和Jsonp的一个小demo 用jQuery与JSONP轻松解决跨域访问的问题
客服端: 在A项目下面 建立一个 JsonpClient.aspx页面,代码如下: <%@ Page Language="C#" AutoEventWireup=& ...
- C# 实现抓取网站页面内容
抓取新浪网的新闻栏目,如图所示: 使用 谷歌浏览器的查看源代码: 通过分析得知,我们所要找的内容在以下两个标签之间: <!-- publish_helper name='要闻-新闻' p_id= ...
- http://linuxme.blog.51cto.com/1850814/372960
http://linuxme.blog.51cto.com/1850814/372960 http://os.51cto.com/art/201404/435129.htm
- cojs QAQ的序列 解题报告
QAQ 这是从论文上搬的一道题目 但是由于并没有找到题目地址,所以就自己造数据咯 发现数据无比难造 (本题数据极弱,暴力或可AC?) 我们考虑离线的话其实只需要莫队就可以了 那么在线怎么做呢 二进制分 ...
- UITableViewCell的重用机制原理
UITableViewCell的重用机制原理 来自http://blog.csdn.net/omegayy/article/details/7356823 ====================== ...
- iOS 应用内付费(IAP)开发步骤
折腾好几天,原来是税务信息没有填写,哎... 国内就是好啊,没有这些麻烦的事情... :) 等24小时,等税务的审核结果... 有结论了 才能测试内购.... 如果税务信息没有填写完毕,p ...
- PHP:错误 Deprecated: Function split() is deprecated in ... 解决办法
PHP:错误 Deprecated: Function split() is deprecated in ... 解决办法 PHP5.3 split() 不建议使用的原因:PHP 5.3.0 之后的r ...
- 内存分析_.Net内存原理介绍
内存原理介绍 1. .Net应用程序中的内存 1.1.Net内存类型 Windows使用一个系统:虚拟寻址系统.这个系统的作用是将程序可用的内存地址映射到硬件内存中的实际地址上.其实际结果 ...
- ACMer(转)
我所了解的ACMer主要分为以下几类: A类:天才型(这个在咱们学校基本不存在),所以就不用考虑了-_- ! B类:刷题很快,题数是最多的几个之一,但有一个习惯就是喜欢看题解,思考问题一想不出来了就想 ...
- Android OpenCV样例调试+报错处理
1.OpenCV样例调试:<OpenCV Sample - image-manipulations> blog+报错:E/CAMERA_ACTIVITY(17665): Cam ...