添加对查找表的引用,如果需要,在查找中插入

时间:2013-03-04 13:14:59

标签: php mysql codeigniter

我想知道是否有更优雅的方式(以及更高的效率)来处理查找表。

假设我有一个表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查询。有没有人有更好的方法呢?

2 个答案:

答案 0 :(得分: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设置为索引PRIMARY并将AUTO_INCREMENTkeyword设置为UNIQUE,则只需要此一个(两个计数insert_id)查询。它不存在并且是INSERTED,否则它只是进行虚拟更新,但无论它返回k_id

Reference

答案 1 :(得分:0)

首先进行所有查找,然后以某种方式对它们进行测试。

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 = ?))