首先規範化表(一個或多個)。
Table tags
id unsigned integer autoincrement primary key,
tag varchar(40) not null,
unique index tag(tag)
Table Item_tags
id unsigned integer autoincrement primary key,
tag_id integer not null,
item_id integer not null
Table items
id unsigned integer autoincrement primary key,
date_added date not null
使用下面的一系列查詢插入一個項目到你的數據庫:
INSERT INTO Items VALUES (null, NOW());
SELECT @last_item_id:= LAST_INSERT_ID();
REPLACE IGNORE INTO tags (tag) VALUES ('pepper', 'onion', 'rice')
INSERT INTO Item_tags
SELECT
null as id
, tags.id
, last_item_id
FROM tags WHERE tags.tag IN ('pepper', 'onion', 'rice')
如果你想簡化添加對象,並簡化你的PHP代碼,
使用黑洞表並在該表上觸發。
CREATE TABLE bh_items (
id unsigned integer autoincrement primary key,
date_added timestamp,
tag1 varchar(45) not null,
tag2 varchar(45) default null,
tag3 varchar(45) default null,
tag4 varchar(45) default null,
tag5 varchar(45) default null,
tag6 varchar(45) default null,
tag7 varchar(45) default null,
tag8 varchar(45) default null,
tag9 varchar(45) default null,
tag10 varchar(45) default null) ENGINE = blackhole;
DELIMITER $$
CREATE TRIGGER ai_bn_items_each AFTER INSERT ON bh_items FOR EACH ROW
BEGIN
DECLARE last_item_id integer;
INSERT INTO Items VALUES (null, new.date_added);
SELECT LAST_INSERT_ID() INTO last_item_id;
REPLACE IGNORE INTO tags ((null, new.tag1)
,(null, new.tag2)
,(null, new.tag3)
,(null, new.tag4)
,(null, new.tag5)
,(null, new.tag6)
,(null, new.tag7)
,(null, new.tag8)
,(null, new.tag9)
,(null, new.tag10));
INSERT IGNORE INTO item_tags (item_id, tag_id)
SELECT last_item_id, tags.tag FROM tags
WHERE tags.tag
IN (new.tag1, new.tag2, new.tag3, new.tag4, new,tag5
, new.tag6, new.tag7, new.tag8, new.tag9, new.tag10);
END $$
DELIMITER ;
如果您使用觸發你可以插入到黑洞表,然後觸發將更新所有3個表。
INSERT INTO bh_items VALUES (null, null, 'onion', 'rice', 'pepper'
, null, null, null, null, null, null, null)
您的所有表格將自動更新。
SELECT tags.tag, COUNT(*) as freq FROM item_tags
INNER JOIN tags ON (item_tags.tag_id = tags.id)
GROUP BY item_tags.tag_id
鏈接:
回到你的問題
你可以從這個使用這個查詢,然後選擇
黑洞:http://dev.mysql.com/doc/refman/5.1/en/blackhole-storage-engine.html
更換成:http://dev.mysql.com/doc/refman/5.1/en/replace.html
觸發器: http://dev.mysql.com/doc/refman/5.1/en/triggers.html
創建表格:http://dev.mysql.com/doc/refman/5.1/en/create-table.html
什麼是表格結構?這些值是存儲在單個列中還是存儲在單獨的列中? – 2011-05-19 13:24:05
你是說「山藥,土豆,洋蔥,胡椒」都出現在一個領域?或者逗號表示新的字段? – Dan 2011-05-19 13:26:22
它們都在一個列中。用逗號分隔。 – 2011-05-19 13:30:23