知識點:mysql中FIND_IN_SET和GROUP_CONCAT()的使用
(一) 場景:當我們使用mysql數據庫,查詢一張的數據,其中的一列存放的是是另一張表id用“,”拼接的字符串
如下圖所示:
person表:
hobby表:
我們前端頁面想展示(把person表hobby一欄存放hobby表id字符串改成name連接的字符串):
(二) sql
這時我們可以使用mysql中的兩個函數FIND_IN_SET()和GROUP_CONCAT()
sql如下:
SELECT p.id, p.`name`,GROUP_CONCAT(h.`name`) as hobby from person p
LEFT JOIN hobby h ON FIND_IN_SET(h.id,p.hobby)
GROUP BY p.id
(三)那 mysql中FIND_IN_SET()和GROUP_CONCAT() 分別是什么意思呢?
(1)FIND_IN_SET()
語法: FIND_IN_SET(str,strlist)
定義: (1)如果字符串str在由N子鏈組成的字符串列表中,則返回值范圍在1-N之間
如:select FIND_IN_SET('c','a,b,c,d') 返回值為 3
(2)如果str不在strlist中或者strlist為空字符串,則返回值為 0
如:select FIND_IN_SET('e','a,b,c,d') 返回值為 0
select FIND_IN_SET('e','') 返回值為 0
(3)如果任意一個參數為NULL,返回NULL
如:select FIND_IN_SET('e',NULL),返回值為NULL
使用:在下面表中,如果我們想查詢人員愛好彈琴的所有人員的話,該怎么查詢呢?
我們可以這樣寫sql:
SELECT * from
(SELECT p.id, p.`name`,GROUP_CONCAT(h.`name`) as hobby from person p
LEFT JOIN hobby h ON FIND_IN_SET(h.id,p.hobby)
GROUP BY p.id) person1
WHERE FIND_IN_SET("彈琴",hobby)
查詢結果:
補充使用 in的話,場景不適用
(2)GROUP_CONCAT()
語法:group_concat( [distinct] 要連接的字段 [order by 排序字段 asc/desc] [separator '分隔符'])
功能:將group by產生的同一分組中的值連接起來,返回一個字符串結果
例如 a.表 person1 數據如下:查詢相同愛好的所有人的名字
sql:
SELECT GROUP_CONCAT(name),hobby from person1 GROUP BY hobby
查詢結果:
b.查詢相同愛好的人員的id,按照從大到小,用“_”拼接
sql:
SELECT GROUP_CONCAT(id order by id desc separator '_' ),hobby from person1 GROUP BY hobby
查詢結果: