前言
本篇博客主要用来记录一些实际工作中会用到的函数以及一些复杂的查询
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中,对单表操作,不使用子查询,ORDER BY
必须放到GROUP BY
后面。
就是只能先分组再排序。
如果我们想先排序 再分组。需要用到子查询,并且子查询需要加上limit
。
例如:表flk_goods_spec_value的数据如下(这里我们只看蓝色选中的数据103-108)
商品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