`
flex_莫冲
  • 浏览: 1095615 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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 多表关联一对多查询实现取最新一条数据的方法示例

    本文实例讲述了MySQL 多表关联一对多查询实现取最新一条数据的方法。分享给大家供大家参考,具体如下: MySQL 多表关联一对多查询取最新的一条数据 遇到的问题 多表关联一对多查询取最新的一条数据,数据出现重复 ...

    mysql多个left join连接查询用法分析

    MySQL中的LEFT JOIN是一种关联多个表的方法,用于返回左表的所有记录以及右表匹配的记录。在某些场景下,我们可能需要连接多个表来获取全面的数据信息。本篇文章将深入探讨MySQL多个LEFT JOIN连接查询的用法,通过...

    mysql Join使用以及优化

    然而,如果被驱动表的字段上没有索引,则Join操作将退化为Simple Nested-Loop Join,即需要对被驱动表执行全表扫描,这种方式效率较低,因为需要遍历被驱动表的每一行去匹配驱动表中的行。 在优化Join操作时,合理...

    Mysql之innerjoin,leftjoin,rightjoin详解.pdf

    Mysql 之 inner join、left join、right join 详解 Mysql 中的连接查询是指从多个表中检索数据,并将它们组合成一个结果集。inner join、left join 和 right join 是 Mysql 中三种最常用的连接查询方式。 inner ...

    MySQL在右表数据不唯一的情况下使用left join的方法

    1.left join 基本用法 mysql left join 语句格式 A LEFT JOIN B ON 条件表达式 left join 是以A表为基础,A表即左表,B表即右表。 左表(A)的记录会全部显示,而右表(B)只会显示符合条件表达式的记录,如果在右表(B)...

    关于sql的left join,right join,inner join,outerjoin

    在SQL查询中,JOIN操作是连接不同表的关键技术,它允许我们从多个相关的表中获取数据。本篇文章将深入探讨四种基本的JOIN类型:LEFT JOIN(左连接)、RIGHT JOIN(右连接)、INNER JOIN(内连接)以及OUTER JOIN(外...

    mysql 多表联接查询练习

    本篇文章将通过具体的练习案例来深入讲解MySQL中的多表联接查询技巧,特别是内联接(INNER JOIN)与外联接(OUTER JOIN)的应用。 #### 二、数据库表结构及数据 为了更好地理解和实践多表联接查询,这里构建了五个...

    MySQL的LEFT JOIN表连接的进阶学习教程

    MySQL的LEFT JOIN是一种关联查询操作,它用于合并两个或多个表的数据,并且返回所有左表(也就是在JOIN语句中位于LEFT关键字之后的表)的记录,即使在右表中没有匹配的记录。这个概念是数据库关系查询中的关键部分,...

    MySQL表LEFT JOIN左连接与RIGHT JOIN右连接的实例教程

    MySQL中的表连接是数据库操作中的核心概念,尤其在处理多表关联的数据时显得尤为重要。本文将深入探讨LEFT JOIN和RIGHT JOIN两种特殊的连接方式,帮助初学者理解这两种连接的语法、用法及其在实际操作中的应用。 ...

    深入理解mysql之left join 使用详解

    ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行。 如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有列为 NULL 的数据 在匹配阶段 WHERE 子句的条件都不会被使用...

    MySQL JOIN 语法说明与 INNER JOIN 语法用法实例.docx

    1. MySQL 的 JOIN 语法用于根据两个或多个表中的字段之间的关系,从这些表中得到数据。 2. JOIN 可以分为三类:INNER JOIN、LEFT JOIN、RIGHT JOIN。 3. INNER JOIN 用于取得两个表中存在连接匹配关系的记录。 4. ...

    mysql not in、left join、IS NULL、NOT EXISTS 效率问题记录

    如果B表比A表大,`LEFT JOIN` 将创建一个与B表相同大小的结果集,然后进行筛选,这会消耗更多的内存和CPU资源。相比之下,`NOT IN` 和 `NOT EXISTS` 在两个集合比较时就完成了筛选,减少了额外的开销。 关于日志...

    MySQL Left JOIN时指定NULL列返回特定值详解

    在SQL查询中,LEFT JOIN操作用于连接两个或更多表,并保留左表(即第一个表)的所有记录,即使右表没有匹配的记录。当右表的某些字段在LEFT JOIN后为NULL时,我们可以利用函数来将这些NULL值替换为特定值,如0或其他...

    mysql临时表用法分析【查询结果可存在临时表中】

    MySQL临时表是一种在会话范围内创建的特殊类型的表,它仅对当前会话可见,并在会话结束时自动删除。这种技术在处理复杂查询、中间数据处理或报表生成时非常有用,因为它允许用户将查询结果暂存起来,以便进一步处理...

    MySQL联表查询基本操作之left-join常见的坑

    在MySQL数据库中,联表查询(也称为JOIN查询)是一种常用的数据检索方法,它允许从多个相关表中合并数据。LEFT JOIN(左连接)是其中一种类型,它返回所有左表(即连接操作的第一个表)的记录,即使在右表(第二个表...

Global site tag (gtag.js) - Google Analytics