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を indexPRIMARYおよびUNIQUEAUTO_INCREMENTに設定している場合はkeyword、この 1 つ (insert_id をカウントする 2 つ) のクエリのみが必要です。存在せず、挿入されているか、ダミーの更新を行うだけですが、関係なくk_id.

参照

于 2013-03-04T13:19:16.743 に答える