php - 在数组上有一个主键列表然后基于它们进行查询时性能受到影响

标签 php mysql

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

  1. 一个
  2. B 以逗号分隔列表 (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;

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

最佳答案

这里的问题是您的值列表存储在一个逗号分隔的字段中。如果你有一个合适的 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"

这将选择 Julia 学院的所有职位发布,并且可以扩展到任意的大学 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/

关于php - 在数组上有一个主键列表然后基于它们进行查询时性能受到影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7318862/

相关文章:

PHP/SQL : SELECT 2 columns 3 times with different values

mysql - 如何获取一个月内剩余可预订天数?

php - 登录后出现警告框,表中插入了一条新记录

php - 我的注册表详细信息未进入数据库(phpmyadmin)

c# - 如何在同一行中找到重复的名称/值?可以算吗?

javascript - Firebase JWT 身份验证

php - 区域设置在 Linux 服务器上不起作用

php - 带有内连接的 WHERE 子句

PHP:爆炸但忽略转义分隔符

php - Wordpress - 在页面编辑中使用 SQL 代码