我想知道是否有更优雅的方式(以及更高的效率)来处理查找表。
假设我有一个表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 :(得分: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_INCREMENT
和keyword
设置为UNIQUE,则只需要此一个(两个计数insert_id)查询。它不存在并且是INSERTED,否则它只是进行虚拟更新,但无论它返回k_id
。
答案 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 = ?))