如何使用MySql'Insert Ignore into'查询根据来自不同表

时间:2015-10-02 18:45:25

标签: mysql

我有两张桌子如下。下面提到的两个表中的Id列值都是自动递增的。

LoginInfo类
+----+------------+-------------+
| Id | LoginName | IP |
+------+----------+-------------+
| 1 | User1 | aa.bb.cc.dd|
| 2 | User2 | xx.xx.xx.xx|
| 3 | User3 | ii.ii.ii.ii|
+----+------------+-------------+

群组
+----+------------+-------------+
| Id | LoginName | Groups |
+------+----------+-------------+
| 1 | User1 | Group1 |
| 2 | User1 | Default |
| 3 | User2 | Group2 |
| 4 | User3 | Group3 |
+----+------------+-------------+

LoginInfo 表中的每个用户都应该是 UserGroups 表中“默认”组的成员。因此,在上表中,User1与“默认”组关联,但User2和User3不关联。

我想检查是否为 UserGroups 表中的每个用户添加了“默认”组条目。如果可用则忽略插入,否则为该用户插入新记录。

我试过的mysql查询是 INSERT IGNORE INTO USERGROUPS(LOGINNAME, GROUPS) SELECT LOGINNAME, 'Default' FROM LOGININFO L WHERE L.IP IS NOT NULL;
执行后,显示为3行的消息受影响, UserGroups 表显示为

+----+------------+-------------+
| Id | LoginName | Groups |
+------+----------+-------------+
| 1 | User1 | Group1 |
| 2 | User1 | Default |
| 3 | User2 | Group2 |
| 4 | User3 | Group3 |
| 5 | User1 | Default |
| 6 | User2 | Default |
| 7 | User3 | Default |
+----+------------+-------------+

但我真正想要的是如下

+----+------------+-------------+
| Id | LoginName | Groups |
+------+----------+-------------+
| 1 | User1 | Group1 |
| 2 | User1 | Default |
| 3 | User2 | Group2 |
| 4 | User3 | Group3 |
| 5 | User2 | Default |
| 6 | User3 | Default |
+----+------------+-------------+

请告知有关查询或任何变通方法的建议。

2 个答案:

答案 0 :(得分:2)

您必须在执行INSERT IGNORE之前添加唯一约束:

ALTER TABLE UserGroups ADD UNIQUE (LoginName, Groups)

然后你可以执行这个查询:

INSERT IGNORE INTO USERGROUPS(LOGINNAME, GROUPS)
SELECT LOGINNAME, 'Default'
FROM LOGININFO
WHERE IP IS NOT NULL

请参阅此fiddle

答案 1 :(得分:1)

您可以通过过滤掉重复记录的方式来构建SELECT语句的INSERT部分:

INSERT INTO UserGroups(LoginName, Groups) 
SELECT LoginName, 'Default' 
FROM LoginInfo AS l 
WHERE l.IP IS NOT NULL 
      AND NOT EXISTS (SELECT 1
                      FROM UserGroups AS ug
                      WHERE ug.LoginName = l.LoginName AND ug.Groups = 'Default');

然后,您不需要使用IGNORE

Demo here