У меня есть две таблицы базы данных, как показано ниже:
Пример данных для форма
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 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 |
+------+-------+-----------+
Сказав это, я бы предложил создать таблицу много-много, которая соединяет формы с полями. Грубая схема структуры таблицы:
Лучшее решение — изменить дизайн ваших столов.
У вас есть несколько форм и несколько полей. Одно поле может принадлежать нескольким формам. Одна форма может иметь несколько полей.
Это отношение многих ко многим
Как это сделать правильно?
Ответ: используя третью таблицу, где вы объединяете идентификаторы вместе.
Например:
FormHasFields
FormId | FieldId
1 1
1 2
1 3
2 1
2 2
В этом случае вам не нужно колонку fields
в вашем Form
Таблица.
Это будет более производительным и простым в управлении.
Ваш запрос, чтобы получить все поля, где идентификатор формы равен 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;
Это должно сделать работу.
Это должно работать
SELECT * FROM FormFields
WHERE Formfields.Id IN(SELECT Fields FROM Form)
Брось WHERE id = 2
от IN, а также.
Разве это не должно быть так —
SELECT * FROM FormFields
WHERE Id IN(SELECT Fields FROM Form WHERE Id = 2)