[求助] 多条件查询怎么实现比较好?

207 天前
 gzk329

数据库表中一个字段如下类型。

[
{"name":"conf1","value":"value1","type":"SYSTEM"},
{"name":"conf2","value":"244","type":"SYSTEM"},
{"name":"conf3","value":"value3","type":"SYSTEM"}
]

来源是用户传入,conf1  value1  这些都是用户自定义。
然后查询的时候,支持用户输入查询条件 ,一个查询条件 key value operator ,
查询条件与查询条件之间关系为 AND 或 OR ,查询条件还得支持分组,组与组之间关系为 AND 或 OR

给这个 json 的 name 属性加个索引?

考虑查询效率,怎么实现比较好? 参数怎么设计比较好?


还是我应该去 battle 一下,砍砍需求? 比如 AND 和 OR 砍掉变成 AND
930 次点击
所在节点    数据库
6 条回复
oneisall8955
207 天前
Gota
207 天前
不确定你用的是什么数据库。如果是关系型数据库,把用户自定义字段单分一张表存,而不是挤在一个 JSON 里,会不会比较容易查?
abc0123xyz
207 天前
purensong
207 天前
直接一刀砍成单条件查询,多查几次
zhangqian99
207 天前
您需要实现复杂的查询逻辑,而且数据是用户自定义的,那么就需要设计一种比较灵活的数据结构和查询方式。在你的情况下,利用 MySQL 的 JSON 数据类型是一个合适的选择。MySQL 从 5.7.8 版本开始支持 JSON 数据类型,可以直接在 SQL 中进行 JSON 的查询和操作。

首先,你的数据表可以设计为以下结构:

```sql
CREATE TABLE Configurations (
id INT AUTO_INCREMENT,
data JSON,
PRIMARY KEY (id)
);
```

在这个表中,`data`列是一个 JSON 类型,用于存储你的配置数据。

然后,你可以为`data`列中的`name`属性创建一个虚拟列,并在这个虚拟列上创建索引,以提高查询效率:

```sql
ALTER TABLE Configurations
ADD COLUMN data_name AS (data->'$.name') VIRTUAL,
ADD INDEX idx_data_name (data_name);
```

查询时,你可以使用 MySQL 的 JSON 查询功能。例如,以下查询可以找到`name`为`conf1`的记录:

```sql
SELECT *
FROM Configurations
WHERE data->'$.name' = 'conf1';
```

对于更复杂的查询,你可能需要构造包含`AND`、`OR`和分组的 SQL 语句。为了实现这一点,你可能需要设计一个查询参数对象,该对象可以表示查询条件和它们的关系。以下是一个简单的设计:

```java
public class QueryCondition {
private String key;
private String operator;
private String value;
private String relation; // AND or OR
private List<QueryCondition> subConditions; // 用于存储分组条件
}
```

在这个设计中,`key`、`operator`和`value`用于表示一个查询条件。`relation`表示这个条件与下一个条件的关系(`AND`或`OR`)。`subConditions`是一个子查询条件列表,用于表示分组条件。

你的查询方法可以接受一个`QueryCondition`列表作为参数,然后根据这个列表构造 SQL 语句。你需要遍历这个列表,并根据每个条件的`key`、`operator`、`value`和`relation`来构造 SQL 语句。对于`subConditions`,你可以使用递归方法来处理。

注意,这是一个基础的设计,根据你的具体需求,可能需要进行一些修改和扩展。并且,请注意在构造 SQL 语句时防止 SQL 注入攻击,永远不要直接拼接用户输入的字符串。
-------- powered by gpt-4 。(一个字都没改)
zzmx
207 天前
我就是 5 楼这种思路弄的,类名都一样 /doge ,支持表格任意字段、任意规则( eq 、like 、between 、in 等)查询。 分组我没弄

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/982469

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX