mysql 一对多 join_mysql多表left join 1对多的解决办法
一个表left join多个表并导出csv本身是很简单的事。但是主表的一列有多个值,一开始用逗号分隔保存数据,这样做的好处是方便应用程序处理,但是对于mysql来说这是anti-pattern的做法。果然,在写left join的时候无法实现一个field保存多ID,并跟关联表匹配输出csv文件。(尝试了find_in_set 只能输入一行)
还是应该遵守RMDB的范式来设计DB,将多值的列,拆分出一个新表来保存。这样写left join时就方便一对一处理。最后,要输出多个值时,多值会存在多列,可以采用GROUP_CONCAT() ... group by将多列值合并为一行。
最终的sql如下
CREATE VIEW edc_v_customer AS SELECT A.`id`,
A.`email`,
A.`mobile`, A.`first_name`,A.`last_name`,
A.`manggis_id`,
A.`external_id`,
GROUP_CONCAT(ST.item_value) as site,
A.`nick_name`,
A.`chinese_name`,
S.`item_value` as sex,
A.`birthdate`,
A.`age`,
G.`item_value` as `age_group`,
I.`item_value` as income,
E.`item_value` as educate,
M.`item_value` as marial,
O.`item_value` as occupation,
C.`item_value` as country,
A.`update_time`,A.`status` FROM edc_customer AS A
LEFT JOIN edc_prop_country AS C ON A.`country_id`>0 and A.`country_id`=C.id
LEFT JOIN edc_customer_in_site AS CS ON (CS.customer_id=A.id)
LEFT JOIN edc_prop_site AS ST ON ST.id=CS.site_id
LEFT join `edc_prop_sex` AS S on A.`sex_id`>0 and S.id=A.`sex_id`
LEFT join `edc_prop_occupation` AS O on A.`occupation_id`>0 and O.id=A.`occupation_id`
LEFT join `edc_prop_marial` AS M on A.`marial_id`>0 and M.id=A.`marial_id`
LEFT join `edc_prop_income` AS I on A.`income_id`>0 and I.id=A.`income_id`
LEFT join `edc_prop_educate` AS E on A.`educate_id`>0 and E.id=A.`educate_id`
LEFT join `edc_prop_age_group` AS G on A.`age_group_id`>0 and G.id=A.`age_group_id`
GROUP BY A.id
; 另外,要记得加上index,如果没有index,表数据大的话会非常慢,甚至拒绝响应。 默认导出csv文件是没有header的,为了增加header,可以选择“Custom - display all possible options”,勾选“Put columns names in the first row”
mysql 一对多 join_mysql多表left join 1对多的解决办法相关推荐
- mysql 一对多 join_Mysql中FIND_IN_SET与JOIN在一对多关系查询时的优劣
Mysql中的FIND_IN_SET函数在我知道它之前,我在做一个一对多的外键查询时,都会在中间设计一个关系表.比如一篇文章(post)对应多个标签(tag),我就会在中间设计一个关系表(post_t ...
- ora-01652:无法通过128(在表空间space中)扩展temp段解决办法
ora-01652:无法通过128(在表空间space中)扩展temp段解决办法.这种情况一看是当前用户所在的表空间达到32G大小上限,需要增加一个新的表空间 一.查询当前用户表空间 select u ...
- mysql json坑_使用mysql innodb 使用5.7的json类型遇到的坑和解决办法
---------------------------------------------- #查询JSON的某个字段 select data -> '$.Host' from temp #创建 ...
- mysql保存时乱码了_MySQL保存中文乱码的原因和解决办法
(3)MySQL的字符集设置. 这个是重点了,一般都是在这里搞错而出现了mysql乱码. mysql编码设置可以分为三种设置:数据库的编码.表的编码.和字段的编码. a.数据库的编码: 在sqlyog ...
- 使用mysql innodb 使用5.7的json类型遇到的坑和解决办法
---------------------------------------------- #查询JSON的某个字段 select data -> '$.Host' from temp#创建虚 ...
- doesnt exist table_Mysql创建表时报错Table doesn't exist解决办法
最近做项目时,本地数据库出了毛病,PHPMyadmin中有几张表不见了,我想应该是误删了吧,于是准备重新建一张表,可是问题出现了,sql报错,说表不存在... 什么鬼!就是因为表不存在我才要创建的好吗 ...
- Linux 3306漏洞,中危漏洞“MySQL,3306,内部敏感服务对外开放存在风险,容易引起安全问题”解决办法...
一.为什么会报MySQL,3306,内部敏感服务对外开放? mysql默认是不允许远程访问服务器的,就像我们本地去访问mysql数据库,它默认是不允许的:如果你有开启远程访问,允许任何地址都能访问你的 ...
- mysql使用中遇到的问题吗_MySQL使用中遇到的问题及解决办法
[问题一]在安装配置MySQL多实例时,出现以下问题 ................................................................ [root@lo ...
- Thinkphp 使用过程中,模型中使用其它表却总是没起作用的解决办法
事由:因为之前的表需要重新命名(前提,模型名称没有修改),导致了很多数据的不正常读取 解决办法:找到thinkphp所使用的缓存文件目录 runtime 文件夹下面 找到 对应该的data/ ...
- MYSQL执行sql时报错:Table 'performance_schema.session_status' doesn't exist解决办法
1.今天,在本地mysql底下执行sql时报错了,报错信息是Table 'performance_schema.session_status' doesn't exist,百度了一下说解决办法是进入m ...
最新文章
- 计算机组装与维修属于什么类,《计算机组装与维修》课程学业水平测试卷(样卷 答案)...
- 数据挖掘算法学习(四)PCA算法
- 排序算法四:归并排序基本原理以及Python实现
- 专业音频如何把电平转换成dbu_谭俊峰|录课、买麦,你应该了解的音频常识
- Linux OpenSSL获取证书指纹值(443、MD5、SHA1、SHA256)
- Gerchberg–Saxton算法
- Xcode启动RN报错“`fsevents` unavailable“
- spingCloud 整合netty
- Wireshark实战分析之ARP协议(一)
- UDP打洞原理及代码
- 计算机如何取消自动关机,如何取消自动关机命令
- python实战项目
- NMAKE makefile内容和功能(1):描述块
- bitset——定义及常用操作。
- 视频与编解码的技术邂逅,碰撞出的高清罗曼史
- 计算任意2个日期内的工作日(没有考虑到国定假日
- 关闭开机弹窗广告2345(其他弹窗也适用)
- gcd euclid_使用EUCLID的算法找到两个数字的GCD(最大公约数)
- jQWidgets Crack 用于响应式 Web 开发
- LeetCode-179-最大数
热门文章
- HttpUrlConnection的简单使用--get和post的简单使用
- 安卓EventBus的使用方法
- 入门React第二天(函数式组件传值)
- http重定向到https
- linux7.2 网卡设置,CentOS 7.2网络配置
- PHPMailer 报错:SMTP ERROR: Failed to connect to server: (0)
- 如何验证 nginx.conf 是否配置正确
- js中将字符串作为函数名来调用的方法
- Yii Framework2.0开发教程(5)数据库mysql函数
- 跟人合作人工智能,方案没有,钱又不出,这怎么合作?