Mysql 工作笔记

前言

本篇博客主要用来记录一些实际工作中会用到的函数以及一些复杂的查询

GROUP_CONCAT()

函数描述:把查询结果(多行)中的某一字段用逗号分隔组成一个值

例如:得到查询一个商品所属分类的名称,用逗号组合。一个商品属于多个分类。

SELECT
	GROUP_CONCAT(fgc.classify_name)
FROM
	flk_goods_classify_ships fgcs
LEFT JOIN flk_goods_classify fgc ON fgc.goods_classify_id = fgcs.classify_id
WHERE
	fgcs.goods_id = 33
AND fgcs.is_delete = 0

结果如下:
在这里插入图片描述

FIND_IN_SET()

函数描述:mysql替代like模糊查询的方法

例如:根据商品分类ID查询该分类下的所有商品,分类ID为18

SELECT * FROM `flk_goods` WHERE FIND_IN_SET('18', classifys);

结果如下:
Mysql 工作笔记_第1张图片

先排序后分组

Mysql中,对单表操作,不使用子查询,ORDER BY 必须放到GROUP BY后面。
就是只能先分组再排序。

如果我们想先排序 再分组。需要用到子查询,并且子查询需要加上limit

例如:表flk_goods_spec_value的数据如下(这里我们只看蓝色选中的数据103-108)
Mysql 工作笔记_第2张图片
商品ID:33 对应的规格有两种:13 (形状) 1(颜色)
规格13(形状)对应的规格值有3种:圆(10) 椭圆(14) 矩形( 1) 这种规格 优先级最高的是椭圆
规格1(颜色)对应的规格值有3种:红(15) 黄(14) 蓝( 1) 这种规格 优先级最高的是红

现在,我想得到该商品每种规格对应的优先级最高的规格值。

// 子查询中加了limit  那么mysql是先排序 再分组
-- EXPLAIN
SELECT a.* FROM (
SELECT
	f1.*
FROM
	flk_goods_spec_value f1
WHERE
	f1.goods_id = 33 
ORDER BY
	`level` DESC LIMIT 1000) as a GROUP BY a.spec_id 
// 子查询中不加limit  那么mysql还是先分组 再排序
-- EXPLAIN
SELECT a.* FROM (
SELECT
	f1.*
FROM
	flk_goods_spec_value f1
WHERE
	f1.goods_id = 33 
ORDER BY
	`level` DESC) as a GROUP BY a.spec_id 

你可能感兴趣的:(Mysql)