我有两个数据库表,如下所示:
-
形式
- 编号
- 名字
- 菲尔兹(瓦尔查尔-255)
-
表单域
- 编号
- 名字
- 输入类型
表单的示例数据
Id Name Fields
1 Form1 1,2,3
2 Form2 1,2
表单域的示例数据
Id Name InputType
1 FName TEXT
2 Lname TEXT
3 Email TEXT
现在我编写如下查询:
SELECT * FROM FormFields
WHERE Id IN (SELECT Fields FROM Form WHERE Id = 2)
我只得到一条记录,如下所示:
Id Name InputType
1 FName TEXT
但是我想要表单字段表的所有记录,其 ID 存在于表单表的字段列中。我想要这样的结果:
Id Name InputType
1 FName TEXT
2 Lname TEXT
不能使用 IN
在逗号分隔的"字符串"内搜索特定值。
您可以使用FIND_IN_SET
来实现此目的:
SELECT FormFields.*
FROM Form
INNER JOIN FormFields ON FIND_IN_SET(FormFields.id, Form.Fields) > 0
WHERE Form.Id = 2
结果:
+------+-------+-----------+
| Id | Name | InputType |
+------+-------+-----------+
| 1 | FName | TEXT |
| 2 | Lname | TEXT |
+------+-------+-----------+
SQL 小提琴
话虽如此,我建议创建一个将表单连接到字段的多对多表。表格结构的粗略概述:
- 表格(身份证、姓名)
- 字段(id、名称、类型)
- FormField (form_id, field_id)
最好的解决方案是重新设计你的表格。
您有多个表单和多个字段。一个字段可以属于多个表单。一个表单可以有多个字段。
这是一个多对多关系
如何正确地做到这一点?
答案是:使用第三个表将 ID 连接在一起。
例如:
FormHasFields
FormId | FieldId
1 1
1 2
1 3
2 1
2 2
在这种情况下,您无需在Form
表中列fields
。
它将更高性能且更易于管理。
获取表单 id 为 2 的所有字段的查询将是:
SELECT * FROM FormFields
JOIN FormHasFields on FormFields.id = FormHasFields.FieldId
JOIN Form on FormHasFields.FormId = Forms.id
WHERE Form.id = 2
是的,重新设计表单表以映射表,如下所示:
FormId FieldId
------ -------
1 1
1 2
1 3
2 1
2 2
然后进行如下查询:
SELECT *
FROM FormFields ff
JOIN Forms f ON ff.id = f.fieldid
WHERE f.form_id = 2;
它应该完成工作。
如果我理解正确,简而言之,这就是正在发生的事情:
你让说两张表:表员工ID、位置 ID、姓名、状态1、1、测试、12, 1, 测试1,03, 2, 测试2,13, 3, 测试3,13, 4, 测试4,1
表用户id,允许的位置ID,用户名等1,[1,2,3],测试用户
现在,您要从员工表中获取所有记录,这些记录正在使用已登录用户测试用户的位置 1 和 2
SELECT * FROM employee WHERE `status`=1 AND `locationid` IN (SELECT locationid FROM employee WHERE FIND_IN_SET(locationid,'1,2,3') )
记下 1,2,3 是用户有权查看的位置那么这将是你的输出:
1, 1, test,1
3, 2, test2,1
3, 3, test3,1
这应该有效
SELECT * FROM FormFields
WHERE Formfields.Id IN(SELECT Fields FROM Form)
也从 IN 中删除WHERE id = 2
。
不应该是这样的——
SELECT * FROM FormFields
WHERE Id IN(SELECT Fields FROM Form WHERE Id = 2)