一、背景
有一张相片表,一张相片所属标签表,一张相片可以归属于多个标签,表结构如下:
现在需要通过一次查询,得到每一张照片对应的标签名称,标签名称之间以固定的分隔符连接,结果如下图:
二、查询语句
原生 Mysql 语句
SELECT think_img.id, think_img.NAME, think_img.label_id, GROUP_CONCAT( think_img_label.NAME SEPARATOR " - " ) AS labelName, think_img.update_time, think_img.create_time FROM `think_img` LEFT JOIN `think_img_label` ON FIND_IN_SET( think_img_label.id, think_img.label_id ) GROUP BY `think_img`.`id` ORDER BY `think_img`.`sort` LIMIT 0,10;
TP5 查询语句
Db::table('think_img')->field('think_img.*,GROUP_CONCAT( think_img_label.name separator " - " ) as labelName') ->join('think_img_label', 'FIND_IN_SET( think_img_label.id,think_img.label_id )', 'left') ->group('think_img.id') ->order('think_img.sort') ->select();
三、关键函数用法
FIND_IN_SET(str,strList)
- str 要查询的字符串
- strList 字段名,参数以“,”分隔,如(1,2,6,8)
- 查询字段(strList)中包含的结果,返回结果null或记录。
GROUP_CONCAT([DISTINCT] expr,[ORDER BY ASC/DESC col_name],[SEPARATOR str_val])
- [DISTINCT] expr 要连接的字段
- [ORDER BY col_name] 排序字段
- [SEPARATOR str_val] 分隔符