2011-09-06 52 views
1

在我的应用程序中我有一个作业表。在工作表中有两个字段有一个阵列上的主键列表,然后根据它们查询

  1. 其中有逗号分隔的列表(1,5,6,3)

在一个特定的页面,我需要

show records where A=2 and B=$pageid (which will be any one id) 
一个
  • 所以我所做的就是根据条件对表格进行预扫描,并根据工作ID列表制作一个满足条件的数组,然后根据这些ID查询特定的记录。

    $jobs = $this->db->get("job_postings"); 
         foreach($jobs->result_array() as $job) 
         { 
          $univArr = explode(",",$job["job_university"]); 
          if((in_array($univid,$univArr)) or ($job["job_post_to"]==2)) { 
           $jobArr[] = $job["id"]; 
          } 
         } 
         return $jobArr; 
    

    但我觉得这不是正确的做法。有没有更好的方法来做到这一点。

  • 回答

    2

    这里的问题是您的值列表存储在一个逗号分隔的字段中。如果你有一个正确的3NF模式,那么你将有一个映射表大学ID将发布ID,你可以使用查询类似如下:

    SELECT * FROM job_postings, universities, university_to_job WHERE 
    job_postings.job_post_to=2 AND 
    university_to_job.job_id=job_postings.job_id AND 
    university_to_job.university_id=universities.university_id AND 
    universities.name="Juliard College" 
    

    这将选择所有Juliard学院和招聘信息可以扩展到任意一组大学ID。根据情况,您可以通过让SQL服务器上的存储过程返回逗号分隔的列中的字段ID拆分列表来实现此目的,但我强烈建议将数据库模式更改为使用适当的映射表。

    要详细说明,现在你的job_university列可能有类似“3,5,8”的字样,表示该职位适用于ID为3,5和8的大学。正确的关系代数方式建立这个是有一个独特的招聘启事ID(检查),唯一的大学ID(检查),然后像这样的表:

    job_posting_id, university_id 
    1    , 3 
    1    , 5 
    1    , 8 
    

    此表将映射职位发布数为1〜大学3,5,和8.

    一旦你有这个映射表,你可以使用JOIN语句(我有一个隐式的上面)来选择只与作业职位相关联的某些大学或与某个工作职位相关的大学。

    对于这种情况,每个工作可能与一个或多个大学相关联,每个大学有一个或多个工作都是“多对多关系”。这就是为什么你需要一个映射表 - 每一方都可能与一个或多个另一方相关联,并且你不想多次存储关于大学或工作的所有信息。

    我强烈建议从以下网站了解更多一点关于构建数据库:

    http://philip.greenspun.com/sql/

    +0

    我担心的是会有很多大学和很多作业的CSV场张贴和行大小增长巨大,这就是为什么我试图以这种方式包含它 – swordfish

    +0

    @swordfish:你是对的。一个好的数据库模式不会重复任何信息,因此只需在每个大学的job_postings中重复一个条目就是一个糟糕的解决方案。用逗号分隔的方法有效;问题在于列表中的单个值对数据库不可见,所以您会得到效率低下的查询。映射表有很小的行(每个都有两个整数),所以它可以扩展到许多工作和许多大学。 – Borealid

    0

    你使用什么数据库框架? $this->db->get("job_postings");似乎检索所有记录,这不是你想要的。你能否在get上添加Where条款?

    +0

    我可以添加一个where子句,但第二场是逗号分隔场 – swordfish

    +0

    你不应该在数据库中使用逗号分隔的值。 – CodeCaster

    +0

    IN是周围的其他方式是,当我想从数据库与阵列比较值,但在这里我有一个我想要比较一个值 – swordfish

    相关问题