mysql多表left join 1對多的解決辦法

2021-09-02 17:02:29 字數 1870 閱讀 3841

乙個表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 ***,

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_***` as s on a.`***_id`>0 and s.id=a.`***_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」

Left join多表查詢

sql 多表查詢中用到的連線查詢使用較多的是left join,連線的表查詢到的資料為空時,主表顯示null值,不會影響整個查詢結果 具體用法 1.建立表單 教師表和學院表 create table if not exists teacher id int 11 auto increment pri...

關於多表的leftJoin

建立表結構如下 create table x.a a1 int,a2 varchar 10 create table x.b b1 int,b2 varchar 10 create table x.c c1 int,c2 varchar 10 insert into x.a values 1 hah...

如何使用LEFT JOIN實現多表查詢

什麼是left join請各位自行了解,廢話不多說,先直接上三張表 組織表 t organization 部門表 t department 使用者表 t user 邏輯是組織下面有部門,部門下面有使用者,組織和部門通過organization id欄位關聯,部門和使用者通過department id...