2013-03-04 56 views
0

我想知道是否有一個更優雅的方式(和更好的效率)來處理查找表。假設我有一個表ITEM(i_id,i_name,...)一個表KEYWORD(k_id,k_name,...)和一個表來鏈接它們ITEM_KEYWORD(i_id,k_id)。添加引用查找表,如果需要插入查找

用戶正在添加/更新項目,並且他們添加了幾個關鍵字(表單上的自由文本)。我會在PHP中做...

foreach (keyword being added) 
    SQL to find keyword in KEYWORD table 
    if found we have the k_id 
    if not, we SQL insert into KEYWORD table and get the new k_id 
    now we can run an SQL to insert into ITEM_KEYWORD the i_id and k_id 

這是每個關鍵字添加3個SQL查詢。有沒有人有更好的方法來做?

回答

0
// foreach 
$this->db->query(" 
INSERT INTO KEYWORD (keyword) 
VALUES ('hello') 
ON DUPLICATE KEY UPDATE k_id = LAST_INSERT_ID(k_id) 
"); 

$kid = $this->db->insert_id(); 

如果你有列k_id集索引PRIMARYAUTO_INCREMENTkeyword獨樹一幟,有隻需要這一個(二計數INSERT_ID)查詢。要麼它不存在並且被插入,否則它只會執行虛擬更新,但不管它是否返回k_id

Reference

0

,然後再測試做你都看UPS對他們莫名其妙。

array keywords from query: 
    SELECT id,name from KEYWORD WHERE KEYWORD.name IN (list of keywords being added) 

new = array_diff(keywords_to_add, keywords) 

insert: INSERT INTO keyword (name) VALUES (values of new keywords as multi-insert) 

for each keyword being added: 

INSERT INTO ITEM_KEYWORD i_id, k_id VALUES (?, (SELECT id FROM KEYWORD WHERE KEYWORD.name = ?))