mysql模糊查询-当存在两个查询条件,其中一个为分类名称的关键字,另一个为内容标题名称的关键字,当查询内容标题的关键字匹配上时,显示该分类和该内容,当查询关键字匹配上分类名称且内容标题不匹配时,则根据排序查询出前几条。
查询的场景
现在需要做一个模糊搜索的功能,根据关键字搜索店家和该店家下面的商品,店家和店家下面的商品一对多的关系。
搜索关键字的时候,根据需求存在两种情况:
- 如果关键字匹配上商品,则展示该商品以及店家信息,
- 如果关键字匹配不上商品,匹配上店家,则要查询排序在前面的一条商品数据,展示该数据和该店家的信息。
- 如果关键字匹配上店家和商品,则展示该商品及该店家的信息。
数据表
-
商家表
-
商品表
-
有需要的老板可以自己根据字段来建表,有点懒…
查询语句
不多逼逼,直接上sql。
SELECT
a.*
FROM
(
SELECT
m.*,
g.goods_name,
g.sort,
IF
( @tem_id = m.id, @tem_num := @tem_num + 1, @tem_num := 0 ) AS 'tem_num',
@tem_id := m.id AS 'tem_id'
FROM
t_merchant m
LEFT JOIN ( SELECT * FROM t_goods ORDER BY sort DESC, id DESC ) g ON m.id = g.m_id
WHERE
m.title LIKE CONCAT( '%', '商', '%' )
AND g.goods_name NOT LIKE CONCAT( '%', '商', '%' )
) AS a
WHERE
a.tem_num <1
UNION
(
SELECT
m.*,
g.goods_name,
g.sort,
IF
( @tem_id = m.id, @tem_num := @tem_num + 1, @tem_num := 0 ) AS 'tem_num',
@tem_id := m.id AS 'tem_id'
FROM
t_merchant m
LEFT JOIN ( SELECT * FROM t_goods ORDER BY sort DESC, id DESC ) g ON m.id = g.m_id
WHERE
g.goods_name LIKE CONCAT( '%', '商', '%' )
)
搜索出来的数据:
其他的关键字查询,各位老板们可以自己去试试,以上的查询算是满足了上文中的需求了。
思路
这里说一下该查询具体的思路吧,该查询分为两个部分,
- 该部分查询店家与该店家商品的关联,并为商品进行排序,为什么排序要单独在()里面排序呢,这个不太清楚的小伙伴了一去了解一下sql的执行顺序。将店家和商品进行关联查询并排序后,再根据商家的ID对商品进行编号,排序在前面的则从0开始编号一次递增。最后再根据关键字进行模糊查询,当然该部分只查询匹配上的商家名称且不匹配商品名,然后取该商家排序最高的商品。
SELECT
m.*,
g.goods_name,
g.sort,
IF
( @tem_id = m.id, @tem_num := @tem_num + 1, @tem_num := 0 ) AS 'tem_num',
@tem_id := m.id AS 'tem_id'
FROM
t_merchant m
LEFT JOIN ( SELECT * FROM t_goods ORDER BY sort DESC, id DESC ) g ON m.id = g.m_id
WHERE
m.title LIKE CONCAT( '%', '商', '%' )
AND g.goods_name NOT LIKE CONCAT( '%', '商', '%' )
- 第二部分嘛,其实跟第一部分一样的,只不过模糊查询,只查询商品。
SELECT
m.*,
g.goods_name,
g.sort,
IF
( @tem_id = m.id, @tem_num := @tem_num + 1, @tem_num := 0 ) AS 'tem_num',
@tem_id := m.id AS 'tem_id'
FROM
t_merchant m
LEFT JOIN ( SELECT * FROM t_goods ORDER BY sort DESC, id DESC ) g ON m.id = g.m_id
WHERE
g.goods_name LIKE CONCAT( '%', '商', '%' )
- 最后,将这两条sql查询出来的数据整合在一起,在这里 小的 就使用 ‘UNION’ 了,这个会对数据去重复。
最后…
最后什么,也没有什么最后了,这条sql的查询效率有待提高,如果关注查询效率的老板们,请慎用哟,有不足的地方欢迎大家在下面留言,这是我能想到最简单粗暴的方法了,
其实上面的分组排序,可以不适用IF的,不过我的mysql是5.x的,所以没有窗口函数,如果有老板的mysql是8.x的,上面的IF就可以换成窗口函数了,毕竟那个更加方便嘛不是,哈哈。
康桑斯密达~~ 各位观众老爷