MySQL INSERT在同一个表上使用带有COUNT()的子查询

jle*_*orf 5 mysql insert mysql-error-1093

我无法INSERT正确执行查询,而且我似乎无法在Google或Stack Overflow上找到解决此特定问题的任何内容.

我正在尝试为特色条目创建一个简单的表,其中entry_id保存到表中以及它的当前顺序.

我想要的输出是这样的:

如果featured表当前有这三个条目:

featured_id    entry_id    featured_order
1              27          0
2              54          1
4              23          2
Run Code Online (Sandbox Code Playgroud)

我希望下一个条目以featured_order= 3 保存.

我试图让以下查询工作没有运气:

INSERT INTO `featured`
(
    `entry_id`, `featured_order`
)
VALUES
(
    200,
    (SELECT COUNT(*) AS `the_count` FROM `featured`)
)
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:You can't specify target table 'featured' for update in FROM clause.

任何人都可以帮助获得计数而不会导致错误的解决方案吗?

提前致谢!

jis*_*one 14

这是一件很酷的事:MySQL的INSERT . . . SELECT:

INSERT INTO `featured`
(
    `entry_id`, `featured_order`
)
SELECT 200, COUNT(*) + 1
FROM `featured`
Run Code Online (Sandbox Code Playgroud)

不需要子查询.


@Bohemian有一个好点:

如果使用这种方法,最好使用max(featured_order)+ 1

所以更好的查询可能是:

INSERT INTO `featured`
(
    `entry_id`, `featured_order`
)
SELECT 200, MAX(`featured_order`) + 1
FROM `featured`
Run Code Online (Sandbox Code Playgroud)

他的触发方法在他的回答中描述也是实现你想要的好方法.


查询1的潜在问题是,如果您删除了一行,则排名将被删除,并且您将有一个副本featured_order.使用第二个查询这不是问题,但是您将有间隙,就像使用自动增量列一样.

如果您绝对必须拥有无间隙的订单,我所知道的最佳解决方案是运行以​​下一系列查询:

SET @pos:=0;

DROP TABLE IF EXISTS temp1;

CREATE TEMPORARY TABLE temp1 LIKE featured;

ALTER TABLE featured ORDER BY featured_order ASC;

INSERT INTO temp1 (featured_id, entry_id, featured_order) 
SELECT featured_id, entry_id, @pos:=@pos+1 FROM words;

UPDATE featured 
JOIN temp1 ON featured.featured_id = temp1.featured_id 
SET featured.rank = temp1.rank;

DROP TABLE temp1;
Run Code Online (Sandbox Code Playgroud)

每当你删除一行