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] ...
随机推荐
- MySQL 5.1参考手册
目录 前言 1. 一般信息 1.1. 关于本手册 1.2. 本手册采用的惯例 1.3. MySQL AB概述 1.4. MySQL数据库管理系统概述 1.4.1. MySQL的历史 1.4.2. My ...
- maven本地仓库.m2文件夹路径讲解
Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Depen ...
- 浏览器的CSS各种hack,大汇总
对着IE久了也有感觉了,在win10出新浏览器以及中国的IE6+用户没有普及新的浏览器前IE还是个坑,所以hack这东西还是要掌握一点的.不废话直接贴图 记得之前在项目里面针对IE6的hack是这样写 ...
- C# 任意类型数据转JSON格式
/// <summary> /// List转成json /// </summary> /// <typeparam name="T">< ...
- MongoDB (五) MongoDB 数据库操作
一.MongoDB创建数据库: use 命令 MongoDB use DATABASE_NAME 用于创建数据库.该命令将创建一个新的数据库,如果它不存在,否则将返回现有的数据库. 语法: use D ...
- C/C++ 位域知识小结
C/C++ 位域知识小结 几篇较全面的位域相关的文章: http://www.uplook.cn/blog/9/93362/ C/C++位域(Bit-fields)之我见 C中的位域与大小端问题 内存 ...
- 关于HTTP协议的学习
HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP 协议的详细内容请参考RFC2616.HTTP协议采用了请求/响应模型.客 ...
- Merry Christmas 2015
祝大家圣诞快乐! 昨天下班在电梯里遇见HR大BOSS,她说公司今天上午有2200个员工要带小孩子来参加Children's Holidy Party...我问了句,那是不是有免费早餐和午餐啊,她说 & ...
- JSP或HTML命名规范
1.jsp与html文件名全部小写 2.数据/内容显示页 名词形式,多个单词用下划线分隔,要求能说明显示内容的信息,为避免冲突,可加上“_list”或者其他的单词.例如:news_message.ht ...
- Java中获取完整的url
Java中获得完整的URl字符串 HttpServletRequest httpRequest=(HttpServletRequest)request; String strBackUrl = &qu ...