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 查询。有没有人有更好的方法?

4

2 回答 2

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 = ?))
于 2013-03-04T13:26:33.987 回答
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并且设置为 UNIQUE AUTO_INCREMENTkeyword则只需要这个(两个计数 insert_id)查询。要么它不存在并且被插入,要么它只是做一个虚拟更新,但不管它返回k_id.

参考

于 2013-03-04T13:19:16.743 回答