mysql - 为什么要添加所有行?仅当存在时插入?

标签 mysql sql

当用户表中存在用户名时,我尝试在提及中插入一行。

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/

相关文章:

php - 如何从 MySQL 数据库中逐字符提取文本?

c# - 减去日期并在数据库的不同列中保存值

mysql - 批量SQL查询更新不同表中的字段

sql - 在 SQL 中,select 语句中表名后面的字母是什么?

MySQL聊天系统显示发件人/收件人的最后一条消息和其他人的姓名

php - 使用 PHP、Ajax 和 Jquery 更改密码

MySQL过程临时表选择

mysql - 数据库设计为每个客户订单存储不同的产品

mysql - 选择匹配并按日期排序,然后是相关性?

mysql - 拉维尔; "SQLSTATE[HY000] [2002] Connection refused"