将数据插入多对多

时间:2011-10-28 22:15:27

标签: php mysql sql

我的表格tags2包含字段tag_idname。我有一个包含字段tag_maptag_id的联结表vid_id,用于将表tags2连接到表video(通过vid_id)。

当我为vid_id插入新标记时,如果tag_map中只有一个条目,我会删除vid_idtag_map的所有条目tag_id,我还删除了表tags2中的标记,以防止出现鬼条目(标记没有相应tag_map条目的条目)。

然后我插入时检查每个标记,以检查tags2表中是否存在该标记。如果是,我得到它tag_id并在tag_map表中插入一个条目。如果不是,我插入两个表。 有更好的方法吗?有人提到我应该在tags2tag_map上都有外键,但我仍然不知道如何检查查看表tags2中是否存在标记,以便我可以获取其tag_id并将其与tag_map中的条目匹配。

foreach($variable as $tag) {

    $sql = 'SELECT *, COUNT(tags2.name) as cnt
FROM tag_map
JOIN tags2 ON tags2.tag_id = tag_map.tag_id
JOIN video ON video.vid_id = tag_map.vid_id
WHERE tags2.name=?';
$stmt_tags2 = $conn->prepare($sql);
$result=$stmt_tags2->execute(array($tag));
while ($row = $stmt_tags2->fetch(PDO::FETCH_ASSOC)) {
    $cnt=$row['cnt'];
    $exist_tag_id=$row['tag_id'];
}

$id=md5(uniqid());
$tag_id=md5(uniqid());

if ($cnt==0){
    $sql="INSERT into tag_map (id,vid_id,tag_id) VALUES (?,?,?)";
$stmt16 = $conn->prepare($sql);
$result=$stmt16->execute(array($id,$vid_id,$tag_id));
    $sql="INSERT into tags2 (tag_id,name) VALUES (?,?)";
$stmt16 = $conn->prepare($sql);
$result=$stmt16->execute(array($tag_id,trim($tag)));
}
else {
$sql="INSERT into tag_map (id,vid_id,tag_id) VALUES (?,?,?)";
$stmt16 = $conn->prepare($sql);
$result=$stmt16->execute(array($id,$vid_id,$exist_tag_id));
}

}

1 个答案:

答案 0 :(得分:1)

您好,我试着阻止您,并告诉您如何制作一个非常好的标签数据库模型。看起来你几乎就在那里,但只需要一点点。

表。 标签 tag_id(主要) 名称(VARCHAR) 状态TinyInt

Tag_rel tag_id(主要) Object_type(主要) object_id(主要) 状态TinyInt (为object_type,object_id添加索引)

好吧所以标签表存储你的标签 - 你已经有了这个。 Tags_rel将您的标记存储到视频关系中。您会注意到我使用了object_type和object_id,因为当您接下来说照片时,object_type = 1可能是视频而object_type = 2可能是照片等等。

现在为您的伪代码。

发布标签 UPDATE tag_rel SET status = 0 WHERE object_type = x和object_id = y

- 正常爆炸

每个标签的

{ 标签表中是否存在标签 不 - 插入并获取ID 是的 - 得到身份证明。 UPDATE tag_rel SET status = 1 WHERE object_type = x和object_id = y AND tag_id = id }

是的,这是我最好的方式,我认为这几乎是一个行业标准,对此查询几乎不确定。

SELECT *,COUNT(tags2.name)为cnt FROM tag_map JOIN tags2 ON tags2.tag_id = tag_map.tag_id JOIN视频ON video.vid_id = tag_map.vid_id WHERE tags2.name =?

我希望我在这里帮到过。 理查德