获取 ID 连接到逗号分隔列表的所有匹配记录
Get all matching records where IDs are joined to a comma separated list
我有两个数据库 table 如下所示:
- 表格
- 编号
- 姓名
- 字段(varchar-255)
- 表单域
- 编号
- 姓名
- 输入类型
表格的示例数据
Id Name Fields
1 Form1 1,2,3
2 Form2 1,2
FormFields
的样本数据
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
但我想要 FormFields table 的所有记录,其 Id 存在于 Fields 中 列 表格 table。我想要这样的结果:
Id Name InputType
1 FName TEXT
2 Lname TEXT
最好的解决方案是重新设计您的 table。
您有多个表单和多个字段。一个字段可以属于多个表单。一个表单可以有多个字段。
这是一个多对多关系
如何正确执行此操作?
答案是:使用第三个 table 将 ID 连接在一起。
例如:
FormHasFields
FormId | FieldId
1 1
1 2
1 3
2 1
2 2
在这种情况下,您不需要在 Form
table 中添加 fields
列。
它将更高效,更易于管理。
获取表单 ID 为 2 的所有字段的查询将是:
SELECT * FROM FormFields
JOIN FormHasFields on FormFields.id = FormHasFields.FieldId
JOIN Form on FormHasFields.FormId = Forms.id
WHERE Form.id = 2
您不能使用 IN
搜索逗号分隔内的特定值 "string".
您可以为此使用 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 |
+------+-------+-----------+
话虽如此,我还是建议创建一个多对多 table 将表单连接到字段。 table 结构的粗略轮廓:
- 表单(id, name)
- 字段(id、名称、类型)
- 表单域 (form_id, field_id)
这应该有效
SELECT * FROM FormFields
WHERE Formfields.Id IN(SELECT Fields FROM Form)
也从 IN 中删除 WHERE id = 2
。
是的,重新设计您的表单 table 以映射 table,如下所示:
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;
它应该完成工作。
不应该是这样吗-
SELECT * FROM FormFields
WHERE Id IN(SELECT Fields FROM Form WHERE Id = 2)
如果我理解正确的话,这就是简而言之:
你说了两个 table:
Table 员工
id, locationid, name, status
1, 1, 测试,1
2、1、测试 1、0
3、2、测试 2、1
3, 3, 测试 3,1
3, 4, 测试 4,1
Table 用户
id,allowedlocationids,用户名等
1,[1,2,3],测试用户
现在您想要从员工 table 获取所有记录,这些记录正在使用位置 1 和 2 登录用户 testuser
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
我有两个数据库 table 如下所示:
- 表格
- 编号
- 姓名
- 字段(varchar-255)
- 表单域
- 编号
- 姓名
- 输入类型
表格的示例数据
Id Name Fields
1 Form1 1,2,3
2 Form2 1,2
FormFields
的样本数据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
但我想要 FormFields table 的所有记录,其 Id 存在于 Fields 中 列 表格 table。我想要这样的结果:
Id Name InputType
1 FName TEXT
2 Lname TEXT
最好的解决方案是重新设计您的 table。
您有多个表单和多个字段。一个字段可以属于多个表单。一个表单可以有多个字段。
这是一个多对多关系
如何正确执行此操作?
答案是:使用第三个 table 将 ID 连接在一起。
例如:
FormHasFields
FormId | FieldId
1 1
1 2
1 3
2 1
2 2
在这种情况下,您不需要在 Form
table 中添加 fields
列。
它将更高效,更易于管理。
获取表单 ID 为 2 的所有字段的查询将是:
SELECT * FROM FormFields
JOIN FormHasFields on FormFields.id = FormHasFields.FieldId
JOIN Form on FormHasFields.FormId = Forms.id
WHERE Form.id = 2
您不能使用 IN
搜索逗号分隔内的特定值 "string".
您可以为此使用 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 |
+------+-------+-----------+
话虽如此,我还是建议创建一个多对多 table 将表单连接到字段。 table 结构的粗略轮廓:
- 表单(id, name)
- 字段(id、名称、类型)
- 表单域 (form_id, field_id)
这应该有效
SELECT * FROM FormFields
WHERE Formfields.Id IN(SELECT Fields FROM Form)
也从 IN 中删除 WHERE id = 2
。
是的,重新设计您的表单 table 以映射 table,如下所示:
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;
它应该完成工作。
不应该是这样吗-
SELECT * FROM FormFields
WHERE Id IN(SELECT Fields FROM Form WHERE Id = 2)
如果我理解正确的话,这就是简而言之:
你说了两个 table: Table 员工 id, locationid, name, status 1, 1, 测试,1 2、1、测试 1、0 3、2、测试 2、1 3, 3, 测试 3,1 3, 4, 测试 4,1
Table 用户 id,allowedlocationids,用户名等 1,[1,2,3],测试用户
现在您想要从员工 table 获取所有记录,这些记录正在使用位置 1 和 2 登录用户 testuser
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