mysql模糊查询-当存在两个查询条件,并且匹配不到时,根据排序查询对应的前几条数据

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( '%', '商', '%' ) 
)

搜索出来的数据:
在这里插入图片描述
其他的关键字查询,各位老板们可以自己去试试,以上的查询算是满足了上文中的需求了。

思路

这里说一下该查询具体的思路吧,该查询分为两个部分,

  1. 该部分查询店家与该店家商品的关联,并为商品进行排序,为什么排序要单独在()里面排序呢,这个不太清楚的小伙伴了一去了解一下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( '%', '商', '%' ) 
  1. 第二部分嘛,其实跟第一部分一样的,只不过模糊查询,只查询商品。
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( '%', '商', '%' ) 
  1. 最后,将这两条sql查询出来的数据整合在一起,在这里 小的 就使用 ‘UNION’ 了,这个会对数据去重复。

最后…

最后什么,也没有什么最后了,这条sql的查询效率有待提高,如果关注查询效率的老板们,请慎用哟,有不足的地方欢迎大家在下面留言,这是我能想到最简单粗暴的方法了,

其实上面的分组排序,可以不适用IF的,不过我的mysql是5.x的,所以没有窗口函数,如果有老板的mysql是8.x的,上面的IF就可以换成窗口函数了,毕竟那个更加方便嘛不是,哈哈。

康桑斯密达~~ 各位观众老爷

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值