当用户表中存在用户名时,我尝试在提及中插入一行。
INSERT INTO mentions (user_id)
SELECT USER_ID
FROM users
WHERE EXISTS (
SELECT USER_ID FROM users
WHERE USERNAME LIKE 'mike'
);
但是,上面的查询将所有 user_ids 添加到提及表中——全部 100 万个。我在这里忽略了什么?
用户表架构
USER_ID | USER_NAME | USER_STATUS
1 | mike | active
2 | brian | active
提及表架构
MENTION_ID | COMMENT_ID | USER_ID
我有一条评论“@mike 你最近和 @john 聊过吗?”我正在解析提及的内容。如果在用户表中找到 mike,我想将其与 comment_id 一起插入到提及表中。
最佳答案
存在需要与外部选择相关,所以像这样
INSERT INTO mentions (user_id)
SELECT u.user_id
FROM users u
WHERE EXISTS
( SELECT 1 FROM mentions m
WHERE u.user_id = m.user_id
AND m.username = 'mike'
);
您还可以使用 IN
INSERT INTO mentions (user_id)
SELECT u.user_id
FROM users u
WHERE u.user_id IN
( SELECT m.user_id FROM mentions m
WHERE m.username = 'mike'
);
注意:
我删除了 LIKE 'mike'
并将其更改为 = 'mike'
...LIKE
在您需要时使用匹配部分字符串...如果您要查找整个字符串,可以使用 =
轻松完成。
如果你想查找部分字符串,那么你应该包含通配符,例如 LIKE "%mike%"
编辑:
根据您最近的编辑,您在不需要子查询时尝试执行子查询。
INSERT INTO mentions (comment_id, user_id)
VALUES
(your_comment_id,(SELECT u.user_id FROM users uWHERE u.username = 'mike'));
但是,表之间似乎应该有某种依赖关系..您可以发布表架构吗?
关于mysql - 为什么要添加所有行?仅当存在时插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26181531/