获取 ID 联接到逗号分隔列表的所有匹配记录


Get all matching records where IDs are joined to a comma separated list

我有两个数据库表,如下所示:

  1. 形式
    • 编号
    • 名字
    • 菲尔兹(瓦尔查尔-255)
  2. 表单域
    • 编号
    • 名字
    • 输入类型

表单的示例数据

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)