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

前端之家收集整理的这篇文章主要介绍了MySQL INSERT在同一个表上使用带有COUNT()的子查询前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

我想要的输出是这样的:

如果特色表目前有这三个条目:

featured_id    entry_id    featured_order
1              27          0
2              54          1
4              23          2

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

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

INSERT INTO `featured`
(
    `entry_id`,`featured_order`
)
VALUES
(
    200,(SELECT COUNT(*) AS `the_count` FROM `featured`)
)

我得到的错误是:您不能在FROM子句中为更新指定目标表’featured’.

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

提前致谢!

最佳答案
这是一件很酷的事:MysqLINSERT . . . SELECT

INSERT INTO `featured`
(
    `entry_id`,`featured_order`
)
SELECT 200,COUNT(*) + 1
FROM `featured`

不需要子查询.

@Bohemian有一个好点:

Better to use max(featured_order) + 1 if you use this approach

所以更好的查询可能是:

INSERT INTO `featured`
(
    `entry_id`,MAX(`featured_order`) + 1
FROM `featured`

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

查询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,@pos:=@pos+1 FROM words;

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

DROP TABLE temp1;

每当你删除一行

原文链接:/mysql/434153.html

猜你在找的MySQL相关文章