我有两个数据库表,如下所示:
表单
的示例数据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
答案 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 |
+------+-------+-----------+
话虽如此,我建议创建一个将Forms连接到Fields的多个表。表格结构的粗略轮廓:
答案 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)