PHP выбрать строку из db, где ID найден в группе идентификаторов

У меня есть 3 идентификатора работодателей: 1, 2 и 3. Я создаю задачи для каждого из них, добавляя строку в базу данных и в столбце «for_emp». Я вставляю идентификаторы, для которых я хочу назначить эту задачу, и может быть все три из них разделены запятая. Итак, допустим, у меня есть задание, а «for_emp» – «1,2,3», идентификаторы работодателей. Если я хотел бы выбрать все задачи для ID 2, смогу ли я выбрать из строки с «1,2,3» в качестве идентификаторов и просто совпадения с «2»? Если нет, как вы предлагаете мне вставлять идентификаторы emp в одну строку в базе данных? Db – это MySQL.

Есть идеи ? Благодарю.

Не делайте этого так, вы должны нормализовать свою базу данных.

То, что вы хотите сделать, – это таблица, такая как task , а затем task_assignee . task_assignee будет иметь поля task_id и user_id . Если задача имеет, например, задачу. три цессионария (идентификаторы 1, 2 и 3), то вы создадите три строки в таблице task_assignee для этой одной task , например:

 +--------+---------+ |task_id | user_id | +--------+---------+ | 1 | 1 [ | 1 | 2 [ | 1 | 3 [ +--------+---------+ 

Тогда просто вопрос запроса таблицы task_assignee найти все задачи, назначенные данному пользователю.

Вот пример того, как получить все задачи для user_id 2:

 SELECT t.* FROM task AS t INNER JOIN task_assignee AS ta WHERE ta.user_id = 2 

РЕДАКТИРОВАТЬ.

Так же, как и связанная с этим заметка, даже если вы не сделали это правильно (о чем я уже говорил в своем ответе ранее), делать это с помощью таких хаков, как LIKE все равно будет далеко от оптимального решения. Если вы сохранили список значений, разделенных запятыми, и вам необходимо проверить, например, например. значение 2 находится в списке, вы можете использовать функцию FIND_IN_SET MySQL:

 SELECT * FROM task WHERE FIND_IN_SET(2, for_emp) 

Но вы не должны этого делать, если у вас нет выбора (например, вы работаете с честолюбивым дизайном БД), потому что он более неэффективен и не позволит вам индексировать идентификатор сотрудника.

Следующий запрос должен делать то, что вы хотите:

 SELECT * FROM tasks WHERE for_emp LIKE '%2%'; 

Однако имейте в виду, что это также будет соответствовать работодателям 12, 20, 21 и т. Д .; поэтому будьте осторожны, если вы ожидаете, что в итоге вы можете удвоить цифры.

Тем не менее, другие ответы о перенормировке вашей базы данных, безусловно, предпочтительнее.

Ты делаешь это неправильно. Создайте таблицу отношений с двумя полями: employee id task id . Если одна задача должна быть назначена трем сотрудникам, вставьте три строки в таблицу отношений.

Затем вы используете JOIN для соединения таблиц задач, сотрудников и отношений.

то его нет надлежащего отношения …

Я бы предложил «таблицу отображения» для отношения n: m

 employee id task id employeetask task_id employee_id 

Сделайте таблицу для своих работодателей. Вставьте в нее три строки.

Затем создайте таблицу для сопоставления задач работодателям. Если задание назначено трем работодателям, вставьте три строки в эту таблицу. Это основная работа сущности-отношения.

Я бы сделал две разные таблицы.

1 с сотрудниками и 1 с заданиями.

затем создайте другую таблицу, которая объединяет две таблицы, я буду называть ее Assigned Tasks.

Затем в назначенных задачах я делаю назначенный идентификатор, номер занятости, который является FK, в таблицу employee и taskid, который является FK в таблице Задачи.

Если у сотрудника более 1 задачи. Просто вставьте другую строку в назначенную таблицу. 😉

Когда его о Базах данных, попытайтесь думать в сольных сущностях! Объединение этих объектов может осуществляться в антешерской таблице.

Пример sql:

Выберите * из Assignedtasks, где employeeID = 1 предоставит вам все его / ее задачи. 🙂

Вы можете использовать предложение LIKE '%,2,%' в инструкции SELECT.

например:

 SELECT * FROM table where for_emp LIKE '%,2,%' 

Однако выполнение таких запросов, не поддающихся обработке, обычно довольно плохое.

Я бы предположил, что вы вставляете строку для каждого сотрудника, которому назначена задача, используя отдельную таблицу taskId, employeeId с taskId, employeeId как составной первичный ключ.

С таким дизайном ваш запрос будет

 SELECT * FROM TASK_EMPLOYEE_MAPPING WHERE employeeId = '2'