首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >标记系统的MySQL模式和CRUD查询

标记系统的MySQL模式和CRUD查询
EN

Stack Overflow用户
提问于 2011-11-08 16:40:31
回答 2查看 446关注 0票数 0

让我们想象一下,我有视频,每个视频可以有几个标签(每个视频最多有10个标签)。

我计划了我的SQL模式,它看起来如下:

  • videosidtitlepath
  • tag_relsidtag_iditem_id (将指向videos.id),
  • tagsidtag;

好吧,对我来说很好。

然后,我写了SELECT,它应该得到视频,加上,标签。

代码语言:javascript
运行
复制
SELECT `videos`.`id`, `videos`.`title`, `videos`.`path`, `tags`.`tag`
FROM `videos`
JOIN `tag_rels`
    ON `tag_rels`.`item_id` = `videos`.`id`
JOIN `tags`
    ON `tags`.`id` = `tag_rels`.`tag_id`

它没有经过测试,因为它都是在思想层面上的。

最大的问题是INSERT查询(我猜是查询)。

据我所知:

  • 查询#1:在videos中插入视频。这将返回主键(videos.id),对吗?
  • 查询2:从数据库中选择标记#1并获取它的主键,
  • 查询#3:如果没有这样的记录(基于标记名(tags.tag) ),那么执行一个插入查询并插入它。目标是获取该标记的主键,
  • 查询#4:在tag_rels中插入带有视频的pk和标记的pk的条目;

因此,每个视频都有一个查询,对的每个标记进行2或3个查询。

这意味着,如果视频有10个标签(最糟糕的情况)没有保存在数据库中,它将花费我1+ 10 *3.嗯..。31查询?!

一定有更好的办法!非常感谢!

我不希望数据库中有重复的条目,我希望在used_intags列中使用标签进行视频计数。将来..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-08 16:50:35

对于存储过程来说,这种情况类似。让商店生产的视频数据,和标签的列表。然后在内部执行查询#1至#4。它将更快,因为您不必来回移动数据。

这是你需要的东西。这只是一个起点,所以不要期望它能够编译更少的正确运行,而且您需要所有的10个标记(我认为mysql不能接受数组,但可能有人会更清楚)。

代码语言:javascript
运行
复制
CREATE PROCEDURE insertvideo (IN videotitle CHAR(20),IN videopath CHAR(20), IN tag1 CHAR(20),IN tag2 CHAR(20), IN tag3 CHAR(20)  )
    BEGIN
      DECLARE myid INT;
      DECLARE tagid INT;
      INSERT INTO videos (title, path) VALUES ( videotitle,videopath);
      SELECT id INTO myid FROM videos WHERE title=videotitle AND path=videopath;
      SET tagid=NULL;
      SELECT id INTO tagid FROM tags WHERE tag=tag1;
      IF tagid IS NULL THEN
        INSERT INTO tags (tag) VALUES (tag1);
        SELECT id INTO tagid FROM tags WHERE tag=tag1;
      END IF;
      INSERT INTO tag_rels (tag_id, item_id) VALUES (tagid,myid);
      SET tagid=NULL;
      SELECT id INTO tagid FROM tags WHERE tag=tag2;
      IF tagid IS NULL THEN
        INSERT INTO tags (tag) VALUES (tag1);
        SELECT id INTO tagid FROM tags WHERE tag=tag2;
      END IF;
      INSERT INTO tag_rels (tag_id, item_id) VALUES (tagid,myid);
      SET tagid=NULL;
      SELECT id INTO tagid FROM tags WHERE tag=tag3;
      IF tagid IS NULL THEN
        INSERT INTO tags (tag) VALUES (tag1);
        SELECT id INTO tagid FROM tags WHERE tag=tag3;
      END IF;
      INSERT INTO tag_rels (tag_id, item_id) VALUES (tagid,myid);
    END 
票数 2
EN

Stack Overflow用户

发布于 2011-11-08 17:00:40

我认为你的计算是错误的。无论标签编号如何,您都需要执行3次查询。

  1. INSERT INTO Video ...
  2. INSERT INTO tags(tag)

SELECT * FROM

(SELECT 'tag_1' as tag UNION SELECT 'tag_2' ...)a WHERE NOT EXISTS (SELECT 1 FROM tags b WHERE b.tag = a.tag)

3.假设您有一个唯一的索引on (tag_id,item_id),INSERT IGNORE INTO tag_rels( tag_id, item_id) SELECT tag_id, new_video_id FROM tags WHERE tags.tag IN ([new tag_list]) (new_video_id -是在向视频中插入记录后得到的Video.id )

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8053941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档