在阵列上有一个主键列表,然后根据它们进行查询,性能受到影响

时间:2011-09-06 11:05:01

标签: php mysql

在我的应用程序中,我有一个工作表。在作业表中有两个字段

  1. A
  2. B以逗号分隔列表(1,5,6,3)
  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 个答案:

答案 0 :(得分: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 College的所有职位发布,并可以扩展到任意一组大学ID。

就目前而言,您可以通过在SQL服务器上存储过程返回逗号分隔的job_university列中的字段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/

答案 1 :(得分:0)

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