加入收藏 | 设为首页 | 会员中心 | 我要投稿 商洛站长网 (https://www.0914zz.com/)- AI应用、CDN、边缘计算、云计算、物联网!
当前位置: 首页 > 数据库 > MySql > 正文

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

发布时间:2020-12-05 00:44:04 所属栏目:MySql 来源:互联网
导读:我无法正确执行INSERT查询,而且我似乎无法在Google或Stack Overflow上找到解决此特定问题的任何内容.我正在尝试为特色条目创建一个简单的表,其中entry_id与它的当前顺序一起保存到表中.我想要的输出是这样的:如果特色表目前有这三个条目:featured_id entry_

我无法正确执行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’.

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

提前致谢!

最佳答案 这是一件很酷的事:MySQL的INSERT . . . 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;

每当你删除一行

(编辑:商洛站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读