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] ...
随机推荐
- To Use Ubuntuubunt
1.rename PC; modify the /etc/hostname. 2.Use root account; 1.set the password for root account: sudo ...
- SQL技术内幕-5 比较特殊 insert into 数据的写法
---比较特殊,第一次看到这种写法,记录下来 create table Student --学生成绩表 ( id int, --主键 Grade int, --班级 Score int --分数 ) ...
- Linux信号处理2
引言 先看以下两个信号量: 13)SIGPIPE 当管道读端关闭,再往管道写东西,会发出SIGPIPE信号 17)SIGCHLD 子进程退出会向父进程发出SIGCHLD信号,系统默认处理是 ...
- LINUX输入输出与文件——续
1 目录操作 改变目录或文件的访问权限 #include <sys/stat.h> int chmod(const char *path, mode_t mode); //mode形如07 ...
- java编译错误:varargs 方法的非 varargs 调用
转自:http://www.blogjava.net/ideame/archive/2007/03/23/105849.html 警告: 最后一个参数使用了不准确的变量类型的 varargs 方法的非 ...
- win32空项目创建窗体
#include "stdafx.h" //窗口过程函数(系统自动调用,即回调函数)LRESULT WINAPI MsgProc(HWND hWnd,UINT msg,WPARAM ...
- ECharts本地部署
将下载的包解压,再将包内文件copy到C:\inetpub\wwwroot下 在html中做如下引用: <script type="text/javascript" sr ...
- 怎么样能让自己的虚拟机上网win7 for linux
我的电脑是win7 32位 虚拟机是linux 我是通过无线连接互联网的 点无线网络连接 右键 点共享 按照我的方式设置 接下来进入 里面会自动的选择这个 如果没有可以自己按照这个设置 接下来进入虚拟 ...
- 308. Range Sum Query 2D - Mutable
题目: Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper ...
- Failed to load unit 'HGCM' (VERR_INVALID_PARAMETER)
1 清除状态: clear the state, 显示 边上有个 清楚 按钮,作用相当于重启虚拟机 restart