3

我有很多带有“狗”标签的文章。我现在有一个名为“猫”的新标签。我想将标签“猫”添加到所有已经有标签“狗”的文章中。一些文章有这两个标签。我不想用“猫”重新标记这些。

换句话说,如果一篇文章有​​标签“狗”但还没有标签“猫”,我想给它添加标签“猫”。这是我写的脚本:

<?php 

    # Get "cat" tag id
    $sql = "SELECT `id`
            FROM tags
            WHERE name = 'cat'
            LIMIT 1";

    $cat_tag = mysql_fetch_assoc(mysql_query($sql));

    # Get "dog" tag id
    $sql = "SELECT `id`
            FROM tags
            WHERE name = 'dog'
            LIMIT 1";

    $dog_tag = mysql_fetch_assoc(mysql_query($sql));

    ######################################

    # Get all nodes tagged with "dog"   
    $sql = "SELECT `node_id`
            FROM node_tags
            WHERE `tag_id` = '" . $dog['id'] . "'";

    $query = mysql_query($sql);
    while($row = mysql_fetch_assoc($query)) {

        # Check to see if current node has "cat" tag already    
        $sql = "SELECT COUNT(*)
                FROM node_tags
                WHERE `node_id` = '" . $row['node_id'] . "'         
                AND `tag_id` = '" . $cat['id'] . "'";


        $check_already_exists = mysql_fetch_assoc(mysql_query($sql));

        # If node doesn't already have "cat" tag, then add it
        if($check_already_exists == '0') {
            $sql = "INSERT INTO `node_tags`(node_id, tag_id) 
                    VALUES('" . $row['node_id'] . "', '" . $cat['id'] . "')";
            mysql_query($sql);
        }
    }

?>

我希望能够直接从我的 MySQL 管理器工具中运行它。所以它不能有任何 PHP,但应该是一个大型 SQL 查询。这个怎么做?

4

5 回答 5

0

首先更改您的表并将(node_id 和 tag_id)一起设为 UNIQUE,因为这似乎是您需要的。

ALTER TABLE `node_tags` ADD UNIQUE (`node_id`,`tag_id`);

这是您的查询:

$sql = "INSERT IGNORE INTO `node_tags`  
        SELECT (SELECT `node_id` FROM node_tags WHERE EXISTS (SELECT tags.* FROM tags WHERE node_tags.`tag_id` = tags.`id` AND tags.name = 'dog') LIMIT 1),
               (SELECT `id` FROM tags WHERE name = 'cat' LIMIT 1)";
于 2012-08-17T19:17:28.153 回答
0

以下查询获取所有没有猫 ID 的“狗”。然后将它们插入到表中:

insert into node_tags(node_id, tag_id)
    SELECT id, $cat['id']
    FROM tags t join
         node_tags nt
         on t.node_id = nt.node_id
    WHERE t.name = 'dog'
    group by id
    having max(case when tag_id = $cat['id'] then 1 else 0 end) = 0
于 2012-08-17T17:19:46.223 回答
0

您不能在一个查询中执行此操作,因为您需要插入取决于从同一个表中选择数据的数据。假设您在以下位置定义了唯一键,您可以获得的最接近的是这样的(node_id,tag_id)

CREATE TEMPORARY TABLE `tmp` (`node_id` TEXT, `tag_id` TEXT); # Choose better column types if possible
INSERT INTO `tmp` SELECT `node_id`, `tag_id` FROM `node_tags`;
SET @id_cat = (SELECT `id` FROM `tags` WHERE `name`='cat'),
    @id_dog = (SELECT `id` FROM `tags` WHERE `name`='dog');
INSERT IGNORE INTO `node_tags` (`node_id`, `tag_id`)
  SELECT `node_id`, @id_cat FROM `tmp` WHERE `tag_id`=@id_dog
  UNION
  SELECT `node_id`, @id_dog FROM `tmp` WHERE `tag_id`=@id_cat;
DROP TABLE `tmp`;

您可以将其粘贴到您的 MySQL 管理器工具中,它应该可以工作。

于 2012-08-17T17:22:47.363 回答
0

您可以根据 select 子句进行插入:

INSERT INTO node_tags (node_id, tag_id)
SELECT node_id, (SELECT MAX(id) FROM tags WHERE name = 'cat') 
FROM node_tags 
WHERE tag_id = (SELECT MAX(id) FORM tags WHERE name = 'dog')

在尝试类似的操作之前进行备份;)

于 2012-08-17T17:23:46.477 回答
0

试试这个查询。我没有测试过这个。但我认为这会奏效。

INSERT into node_tags(node_id, tag_id)
( SELECT node_id, tag_id
 FROM node_tags nt , tags t
 where t.id = nt.tag_id AND t.name = 'dog' 
 AND nt.node_id NOT IN (SELECT t1.id FROM node_tags nt1, tags t1
 where nt1.node_id = nt.node_id  AND t1.id = nt1.tag_id AND t1.name = 'cat')
)
于 2012-08-17T18:22:29.597 回答