PHP从db中选择行,其中ID在ID组中找到

时间:2010-10-06 08:55:32

标签: php mysql

我有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。

有什么想法吗?感谢。

7 个答案:

答案 0 :(得分:7)

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

您要做的是拥有一个表格,例如task,然后task_assigneetask_assignee会有字段task_iduser_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 idtask 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