我有3个雇主ID:1,2和3.我通过在数据库中添加一行并在“for_emp”列中为每个人生成任务我插入了我想要分配此任务的ID,并且可以是所有3个它们用逗号分隔。所以,假设我有一个任务,“for_emp”是“1,2,3”,雇主ID。如果我想为ID 2选择所有任务,我是否可以从具有“1,2,3”作为ID的行中选择并在那里匹配“2”?如果没有,您如何建议我将我的emp ID插入数据库中的一行? db是MySQL。
有什么想法吗?感谢。
答案 0 :(得分:7)
不要这样做,你应该normalize你的数据库。
您要做的是拥有一个表格,例如task
,然后task_assignee
。 task_assignee
会有字段task_id
和user_id
。如果任务有例如。三个受理人(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
EDIT。
就像一个相关的注释,即使你没有以正确的方式(我之前在我的回答中描述)这样做,使用诸如LIKE
之类的黑客做这件事仍然远非最佳解决方案。如果您确实存储了逗号分隔值的列表,并且需要检查是否例如。值2在列表中,您可以使用MySQL的FIND_IN_SET
函数:
SELECT * FROM task WHERE FIND_IN_SET(2, for_emp)
但你不应该这样做,除非你别无选择(例如,你正在使用某人糟糕的数据库设计),因为它效率更低,不会让你为员工ID编制索引。
答案 1 :(得分:0)
以下查询应该执行您想要的操作:
SELECT * FROM tasks WHERE for_emp LIKE '%2%';
但请注意,这也符合雇主12,20,21等;所以如果你希望你可能会以两位数结束,请小心。
然而,关于重新规范数据库的其他答案绝对是可取的。
答案 2 :(得分:0)
你做错了。使用两个字段创建关系表:employee id
和task id
。如果应将一个任务分配给三个员工,请在关系表中插入三行。
然后使用JOIN
加入任务,员工和关系表。
答案 3 :(得分:0)
我建议使用n:m关系的“映射表”
employee
id
task
id
employeetask
task_id
employee_id
答案 4 :(得分:0)
为您的雇主制作一张桌子。在其中插入三行。
然后制作一张表,用于将任务映射到雇主。如果将任务分配给三个雇主,请在此表中插入三行。这是基本的实体关系工作。
答案 5 :(得分:0)
我会制作两张不同的牌桌。
1与员工,1与任务。
然后创建另一个组合两个表的表,我将其称为Assigned Tasks。
然后在分配的任务中,我创建一个指定的id,一个从雇员表到FK的雇员编号和一个任务表,它是到任务表的FK。
如果员工有超过1个任务。只需在指定的表中插入另一行。 ;)
当它关于数据库时,尝试在独立实体中思考!这些实体的组合能够在另一个表中。
sql示例:
从Assignedtasks中选择*,其中employeeID = 1将为您提供他/她的所有任务。 :)
答案 6 :(得分:0)
您可以在SELECT语句中使用LIKE '%,2,%'
子句。
例如:
SELECT * FROM table where for_emp LIKE '%,2,%'
然而,这种不可搜索的查询的表现通常非常糟糕。
我建议您使用单独的TASK_EMPLOYEE_MAPPING
表格作为复合主键为每个分配给该任务的员工插入一行。
使用这样的设计,您的查询将是
taskId, employeeId