我无法正确执行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的
原文链接:/mysql/434153.htmlINSERT . . . 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;
每当你删除一行