2012-07-20 62 views
0

exp表:這是我存儲條目的位置,同時將域和子域保留在單獨的表中。 sub_domain列可以有一個或多個與misc中的id列匹配的ID。多個ID的聯接表

+----+---------+-----------+------------+-----------+--------+-------------+------------+------------+ 
| id | user_id | job_type | experience | exp_title | domain | sub_domain | start  | end  | 
+----+---------+-----------+------------+-----------+--------+-------------+------------+------------+ 
| 83 |  268 | Full Time | dasdfg  | dest  | 76  | 89,91,93,95 | 07/15/2012 | 07/31/2012 | 
| 84 |  269 | Full Time | abcdef  | title  | 77  | 89   | 07/15/2011 | 07/31/2011 | 
+----+---------+-----------+------------+-----------+--------+-------------+------------+------------+ 

雜項表:

+-----+----------------------------------------+--------------+ 
| id | name         | category  | 
+-----+----------------------------------------+--------------+ 
| 89 | Name1         | category | 
| 91 | Name2         | category | 
| 93 | Name3         | category | 
| 95 | Name4         | category | 
| 55 | Name5         | category | 

我想知道如何改變LEFT JOIN misc c ON a.sub_domain=c.id如果在使用EXP表中的多個sub_domains同時牢記可以有一個ID爲好。

$query_str = "SELECT a.*, b.name, c.name AS sub_name 
      FROM exp a 
      LEFT JOIN misc b ON a.domain=b.id 
      LEFT JOIN misc c ON a.sub_domain=c.id 
      WHERE a.user_id = ?"; 
+4

考慮從[1NF]重組你的表(http://en.wikipedia.org/wiki/First_normal_form)到[2NF](http://en.wikipedia.org/wiki/Second_normal_form)。 – 2012-07-20 10:11:51

回答

0

使用逗號分隔值的列是不好的。閱讀關於這個問題的答案:

Is storing a comma separated list in a database column really that bad?

簡短的回答是:它真的那麼糟糕。


直到你解決這個設計,你可以使用FIND_IN_SET()功能:

$query_str = " 
     SELECT a.*, b.name, c.name AS sub_name 
     FROM exp a 
      LEFT JOIN misc b ON a.domain = b.id 
      LEFT JOIN misc c ON FIND_IN_SET(c.id, a.sub_domain) 
     WHERE a.user_id = ? 
      "; 
+0

應該用什麼來代替逗號? – Ciprian 2012-07-20 11:15:02

+0

用於存儲域和子域之間的一對多(或多對多)關係的另一個表。 – 2012-07-20 11:17:06

0

試試這個

$query_str = 
    "SELECT a.*, b.name, c.name AS sub_name 
    FROM exp a 
    LEFT JOIN misc b ON a.domain=b.id 
    LEFT JOIN misc c ON locate(concat('','',c.id ,'',''),'','',a.sub_domain,'','') >0 
    WHERE a.user_id = ?"; 
0

你不得不爲此在兩個查詢。其中一個主要原因是,如果您設法完成您想要完成的任務,那麼除了sub_name列之外,您將返回實際上具有相同數據的行。這真的沒有必要。

您可以首先JOINa.domain = b.id上的兩個表,然後構造第二個查詢使用所有子域值的IN(...)語句。它會是這樣的:

$subdomains = explode(',', $data_from_first_query['sub_domain']); 
if (count($subdomains)) { 
    $q2 = ' 
    SELECT 
     b.name 
    FROM 
     misc AS b 
    WHERE b.id IN ('.implode(',',array_fill(0, count($subdomains), '?')).')'; 
} 

然後使用foreach綁定佔位符中的值。

但是,再次,確保您的數據庫正常化是一個很好的做法。