我正在使用子查询的结果在表中插入多行:
INSERT INTO `doc-file` (docId, fileId) VALUES
((SELECT id FROM documents WHERE slug = :slug LIMIT 1), :file1),
((SELECT id FROM documents WHERE slug = :slug LIMIT 1), :file2),
((SELECT id FROM documents WHERE slug = :slug LIMIT 1), :file3),
子查询的结果对于我要插入的每一行都是相同的,因此实际上只需要运行一次。这样写,子查询不会多次运行吗?有没有一种方法可以只运行一次该子查询,并且仍然将其结果重复使用到多行中?
答案 0 :(得分:1)
您可以使用变量:
set @value = (SELECT id FROM documents WHERE slug = :slug LIMIT 1);
INSERT INTO `doc-file` (docId, fileId) VALUES
(@value, :file1),
(@value, :file2),
(@value, :file3),
答案 1 :(得分:0)
您可以在单独的临时表中唯一文件,并按1 = 1的条件将其加入 如果您不想维护单独的表,则在子查询中填充不同的值 所以您将有单独的表,让说fileNames 文件名: 文件1 文件2 file3
INSERT INTO `doc-file` (docId, fileId) VALUES
( select a.id,f.fileID
(SELECT id FROM documents WHERE slug = :slug LIMIT 1) a
inner join filenames f on 1=1
))
答案 2 :(得分:0)
您可以通过UNION ALL
少FROM
的{{1}}交叉连接子查询和另一个子查询来获取文件。
SELECT