2010-10-06 65 views
0

我有3个雇主ID:1,2和3.我通过在数据库中添加一行并在列“for_emp”中生成每个任务我插入ID我想分配这个任务,并且可以用逗号分隔它们中的所有3个。假设我有一项任务,“for_emp”是“1,2,3”,即雇主ID。如果我想选择ID 2的所有任务,我可以从具有“1,2,3”作为ID的行中选择,并在那里匹配“2”?如果不是,你如何建议我将我的emp ID插入数据库中的一行?数据库是MySQL。PHP从数据库中选择行,其中ID在ID组中找到

任何想法?谢谢。

+0

谢谢您的答复。所以,如果我使用关系表,我怎样才能显示数据到我的网格与任务ID,任务名称,分配雇主?我想在一行中显示如下:1 |测试任务| Emplpoyee 1,员工2,员工3.我的意思是我必须获取他们的姓名并将其作为一个列显示。 – 2010-10-06 09:17:37

回答

7

不要这样做,你应该normalize你的数据库。

你想要做的是有一张表,如task,然后task_assigneetask_assignee将有字段task_iduser_id。如果任务有例如。 3个受让人(ID为1,2和3),那么你会为一个task建立在task_assignee表三人行,像这样:

+--------+---------+ 
|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是在列表中,你可以使用MySQL的FIND_IN_SET功能:

SELECT * FROM task WHERE FIND_IN_SET(2, for_emp) 

但除非你别无选择,你不应该这样做(如:你与别人的低劣DB设计工作),因为它的效率更低,不会让您索引员工ID。

+0

问题是当我想列出所有任务的细节。我需要选择所有任务,并且为每个任务行我需要在task_assignee中获取此任务的每个雇主条目,以便我最终获得任务ID |雇主名称1,雇主名称2,雇主名称3 |任务描述|截止日期。所以,当我选择任务行时,我需要一种方法将这3个雇主的姓名添加到一列中以供显示。我希望你明白我想说的是什么。非常感谢你。 – 2010-10-06 09:30:51

+0

你有两个(好的)选择。第一种方法就是加入用户,比如'SELECT t。*,u。* FROM task t INNER JOIN task_assignee ta ON ta.task_id = t.id INNER JOIN user u ON u.id = ta.user_id'。这种方法的不足之处在于,如果任务有多个受理人,那么您也可以获得重复的任务行,但它足够简单,只需解析一次所需的数据即可。第二种方法是首先找到你想要的所有任务,然后第二个查询来获取所有这些任务的用户,例如:'SELECT u。* FROM user u INNER JOIN task_assignee ta ON ta.user_id = u.id WHERE ta.task_id IN(TASK_IDS)' – 2010-10-06 09:41:59

0

以下查询应该做你想要什么:

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

但是,要知道,这也符合雇主12,20,21等;所以请注意,如果你期望你可能会以两位数字结束。

但是,关于重新规范化数据库的其他答案肯定是可取的。

+0

如果必须这样做(如果数据已正确归一化,则不应该这样做),那么SELECT * FROM任务WHERE CONCAT(',',for_emp,',')LIKE'%,2,%';或SELECT * FROM任务WHERE for_emp LIKE'2'或for_emp LIKE'%,2,%'或for_emp LIKE'2,%'或for_emp LIKE'%,2'; – 2010-10-06 09:02:39

0

你做错了。创建具有两个字段的关系表关系表employee idtask id。如果应将一个任务分配给三名员工,则在关系表中插入三行。您可以使用JOIN加入任务,员工和关系表。

0

那么它没有正确的关系......

我建议“映射表”为N:M关系

employee 
    id 

task 
    id 

employeetask 
    task_id 
    employee_id 
0

做一个表,你的雇主。将三行插入其中。

然后建立一个表格,将任务映射到雇主。如果任务分配给三位雇主,则在此表中插入三行。这是基本的实体关系工作。

0

我会做2个不同的表。

1与员工,1与任务。

然后制作另一张结合了两张表的表,我将其称为分配任务。

然后,在分配的任务中,我创建一个分配的ID,雇员表中的FK的雇员编号和作为FK到任务表的taskid。

如果员工有超过1个任务。只需在分配的表格中插入另一行。 ;)

当它关于数据库时,尝试在独奏实体中思考!将这些实体组合起来可以在antoher表中。

SQL示例:

从Assignedtasks选择*其中雇员= 1会给你所有的他/她的任务。 :)

0

您可以在您的SELECT语句中使用LIKE '%,2,%'子句。

如:

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

然而这种非优化搜索查询的性能通常是相当糟糕的。

我建议你为分配给该任务的每个员工分别插入一行,使用单独的​​表和taskId, employeeId作为复合主键。

有了这样的设计,您的查询就会

SELECT * FROM TASK_EMPLOYEE_MAPPING WHERE employeeId = '2' 
相关问题