Получить все соответствующие записи, где идентификаторы объединены в список через запятую

У меня есть две таблицы базы данных, как показано ниже:

  1. форма
    • Я бы
    • название
    • Поля (VARCHAR-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    Name     InputType
1     FName    TEXT
2     Lname    TEXT

4

Решение

Вы не можете использовать 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


Сказав это, я бы предложил создать таблицу много-много, которая соединяет формы с полями. Грубая схема структуры таблицы:

  • Форма (идентификатор, имя)
  • Поле (идентификатор, имя, тип)
  • FormField (form_id, field_id)
3

Другие решения

Лучшее решение — изменить дизайн ваших столов.

У вас есть несколько форм и несколько полей. Одно поле может принадлежать нескольким формам. Одна форма может иметь несколько полей.
Это отношение многих ко многим

Как это сделать правильно?
Ответ: используя третью таблицу, где вы объединяете идентификаторы вместе.

Например:

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
1

Да, измените форму таблицы форм на таблицу соответствия следующим образом:

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;

Это должно сделать работу.

0

Это должно работать

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

Брось WHERE id = 2 от IN, а также.

-1

Разве это не должно быть так —

SELECT * FROM FormFields
WHERE Id IN(SELECT Fields FROM Form WHERE Id = 2)
-2
По вопросам рекламы [email protected]