У меня есть 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'