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

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

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

  1. 表格
    • 编号
    • 姓名
    • 字段(varchar-255)
  2. 表单域
    • 编号
    • 姓名
    • 输入类型

表格的示例数据

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      |
+------+-------+-----------+

SQL Fiddle


话虽如此,我还是建议创建一个多对多 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