mysql 有一个商品有多个标签,标签使用标签id加逗号的方式存在一个字段中,现在传入多个标签id进行搜索,查询匹配的商品列表,并按照商品匹配的标签数量从大到小排序
时间: 2024-03-12 14:43:18 浏览: 23
可以使用 MySQL 的 FIND_IN_SET() 函数来完成这个需求。FIND_IN_SET() 函数可以在指定字符串中查找某个子串,并返回其所在位置。将商品的标签id使用逗号分隔存储在一个字段中,可以使用 FIND_IN_SET() 函数来查找匹配的标签。
下面是一个示例 SQL 语句,可以根据传入的标签id列表查询匹配的商品列表,并按照商品匹配的标签数量从大到小排序:
```
SELECT
*,
(
SELECT COUNT(*)
FROM tags
WHERE FIND_IN_SET(tags.id, products.tag_ids)
) AS match_count
FROM products
WHERE FIND_IN_SET(tag_id_1, products.tag_ids)
AND FIND_IN_SET(tag_id_2, products.tag_ids)
AND FIND_IN_SET(tag_id_3, products.tag_ids)
ORDER BY match_count DESC;
```
其中,`tag_id_1`、`tag_id_2`、`tag_id_3` 是传入的标签id,`products` 表存储商品信息,`tags` 表存储标签信息,`tag_ids` 是商品表中存储标签id的字段。
这个 SQL 语句会先在商品表中查找匹配所有传入标签id的商品,然后使用子查询计算每个商品匹配的标签数量,并按照匹配数量从大到小排序返回结果。
相关问题
mysql 有个数据有个标签字段,标签的id存储是用逗号隔开的方式,通过多个标签id来查询数据,并返回传入id的命中次数
你可以使用 MySQL 的 FIND_IN_SET 函数来实现这个需求。具体的 SQL 语句如下:
```
SELECT id, COUNT(*) AS hits
FROM your_table
WHERE FIND_IN_SET('tag_id_1', tags) OR FIND_IN_SET('tag_id_2', tags)
GROUP BY id;
```
其中,'tag_id_1' 和 'tag_id_2' 是你要查询的标签的 ID。如果你有多个标签,可以继续添加 FIND_IN_SET 函数。这个 SQL 语句将会返回一个结果集,其中包含了所有命中标签的数据的 ID 和命中次数。
mysql传入list参数查多条数据
在MySQL中传入list参数查多条数据可以使用IN语句,但是如果要动态传入list参数,需要使用动态SQL。下面是一个使用动态SQL传入list参数查询多条数据的示例:
假设有一个表名为`user`,表中有`id`和`name`两个字段,现在要根据传入的id列表查询对应的多条数据。
1. 首先,需要将传入的id列表转换为逗号分隔的字符串,可以使用Java中的String.join()方法来实现,示例代码如下:
```java
List<Integer> idList = Arrays.asList(1, 2, 3);
String idStr = String.join(",", idList.toString());
```
2. 然后,在MySQL中使用动态SQL构造查询语句,示例代码如下:
```sql
SET @idList = '1,2,3';
SET @sql = CONCAT('SELECT * FROM user WHERE id IN (', @idList, ')');
PREPARE stmt FROM @sql;
EXECUTE stmt;
```
其中,@idList是一个MySQL变量,用于存储转换后的id列表字符串,@sql是一个MySQL语句,用于动态构造查询语句,PREPARE stmt FROM @sql用于准备查询语句,EXECUTE stmt用于执行查询语句。
这样就可以根据传入的id列表查询对应的多条数据了。
相关推荐
![text/plain](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)