2011-09-06 43 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

    相關問題