获取ID加入逗号分隔列表的所有匹配记录

时间:2015-03-13 09:54:33

标签: php mysql sql subquery

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

  1. 表格
    • 编号
    • 名称
    • 字段(VARCHAR-255)
  2. FormFields
    • 编号
    • 名称
    • 的inputType
  3. 表单

    的示例数据
    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 表的所有记录 ID 出现在表单字段列中表。我想要这样的结果:

    Id    Name     InputType
    1     FName    TEXT
    2     Lname    TEXT
    

6 个答案:

答案 0 :(得分:3)

您无法使用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 Fiddle


话虽如此,我建议创建一个将Forms连接到Fields的多个表。表格结构的粗略轮廓:

  • 表格(身份证,姓名)
  • 字段(id,名称,类型)
  • FormField(form_id,field_id)

答案 1 :(得分:1)

最好的解决方案是重新设计表格。

您有多个表单和多个字段。一个字段可以属于多个表单。一种形式可以有多个字段 这是多对多关系

如何正确地做到这一点?
答案是:使用第三个表来加入ID。

例如:

FormHasFields
FormId | FieldId
1        1
1        2
1        3
2        1
2        2

在这种情况下,您无需在fields表格中列Form列 它将更高效,更易于管理。

获取表单ID为2的所有字段的查询将是:

SELECT * FROM FormFields
JOIN FormHasFields on FormFields.id = FormHasFields.FieldId
JOIN Form on FormHasFields.FormId = Forms.id
WHERE Form.id = 2

答案 2 :(得分:0)

是的,将您的Forms表重新设计为映射表,如下所示:

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;

它应该做的工作。

答案 3 :(得分:0)

如果我对您的理解正确,这就是简而言之:

您要说两个表: 表员工 ID,位置ID,名称,状态 1,1,测试1 2,1,测试1,0 3、2、2、1 3、3、3、1 3,4,test4,1

表用户 id,allowedlocationids,用户名等 1,[1,2,3],测试用户

现在您要从登录到用户testuser的employee表中获取与位置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

答案 4 :(得分:-1)

这应该有效

SELECT * FROM FormFields 
WHERE Formfields.Id IN(SELECT Fields FROM Form)

也从IN中删除WHERE id = 2

答案 5 :(得分:-2)

不应该是这样 -

SELECT * FROM FormFields 
WHERE Id IN(SELECT Fields FROM Form WHERE Id = 2)