使用select在重复密钥上插入MySql无效

使用select在重复密钥上插入MySql无效,mysql,sql,Mysql,Sql,如何在插入中为重复密钥更新零件使用select 我以为这会,但事实并非如此。但是,“选择零件”本身工作正常 insert into tags (tag) values ('sony') ON DUPLICATE KEY UPDATE total = ( select count(*) from items where FIND_IN_SET(tag, tags) ) WHERE tag IN ('sony'); 项目 标签 尝试修复括号: insert into tags(tag)

如何在插入中为重复密钥更新零件使用select

我以为这会,但事实并非如此。但是,“选择零件”本身工作正常

insert into tags (tag) values ('sony') ON DUPLICATE KEY UPDATE total = (
    select count(*) from items where FIND_IN_SET(tag, tags)
) WHERE tag IN ('sony');
项目

标签


尝试修复括号:

insert into tags(tag)
    values ('sony')
    ON DUPLICATE KEY UPDATE total = (select count(*)
                                     from items
                                     where FIND_IN_SET(tag, tags) and
                                           tag IN ('sony')
                                     );
结尾的where子句应导致语法错误

编辑:

如果需要插入的值,可以尝试:

insert into tags(tag)
    values ('sony')
    ON DUPLICATE KEY UPDATE total = (select count(*)
                                     from items
                                     where FIND_IN_SET(VALUES(tag), tags) 
                                    );
我没有在子查询中尝试过这一点,但值在表达式中确实起作用

INSERT INTO tags (tag)
  VALUES ('sony')
ON DUPLICATE KEY UPDATE
  total = (
    SELECT COUNT(*)
    FROM items
    WHERE FIND_IN_SET('sony', tags)
  )

“sony”中的条件标记不是必需的,因为在重复密钥更新更新行中,标记=“sony”-因为该行报告重复。

我从未在插入中使用子查询作为表达式。。。关于重复键语句。如果这是有效的,那么Rimas的答案中的模式,或者Gordon的第二个例子中的模式,将是您想要的

我觉得奇怪的是,只有在UPDATE操作中,而不是在INSERT操作中,才为total列指定了一个值

就我个人而言,我更喜欢在INSERT中为total列指定一个值。我会这样做:

插入标签标签,总计 选择“sony”,从项目i中选择COUNT*,在“sony”集合i标签中查找 重复密钥时更新总计=值总计
为什么我总是在where子句@Norman中得到未知列“tag”。可能是因为标记不在items表中。您没有指定表的数据布局,只指定非工作查询,因此无法知道给定值的位置。您是否更改了此答案,因为现在我在“位置”中获得了未知列“标记”clause@Norman你是对的,这里需要重复的'索尼'价值更正代码。
insert into tags(tag)
    values ('sony')
    ON DUPLICATE KEY UPDATE total = (select count(*)
                                     from items
                                     where FIND_IN_SET(VALUES(tag), tags) 
                                    );
INSERT INTO tags (tag)
  VALUES ('sony')
ON DUPLICATE KEY UPDATE
  total = (
    SELECT COUNT(*)
    FROM items
    WHERE FIND_IN_SET('sony', tags)
  )