通过多对多关系从表中查找缺失的行

时间:2013-11-17 10:41:12

标签: php mysql sql

我有3张桌子

user表:

+---------+---------------------+
| user_id | username            |
+---------+---------------------+
|    1136 | 007                 |
|     978 | 11zep11the11hyerian |
|    1049 | 123456789           |
+---------+---------------------+

setting表:

+------------+----------------+
| setting_id | identifier     |
+------------+----------------+
|          1 | email-on-like  |
|          2 | email-on-reply |
|          3 | share-on-vote  |
+------------+----------------+

user_setting表:

+-----------------+---------+------------+-------+
| user_setting_id | user_id | setting_id | value |
+-----------------+---------+------------+-------+
|               6 |      49 |          2 | 1     |
|               8 |      53 |          2 | 1     |
|               9 |      54 |          1 | 1     |
+-----------------+---------+------------+-------+

setting表表示用户可以对其帐户设置的可用设置。 user_setting表是保存这些设置的位置。有时会在setting表中添加一个新设置,基本上我想创建一个查询,该查询将反映user_setting表中缺少的行,以便我可以相应地插入它们。

2 个答案:

答案 0 :(得分:1)

如果您在寻找单个用户的缺失设置,则可以选择以下两个选项:

SELECT s.setting_id
FROM setting AS s
WHERE s.setting_id NOT IN (SELECT us.setting_id FROM user_setting AS us WHERE us.user_id = ? )

或在Oracle上:

SELECT s.setting_id FROM setting s
MINUS
SELECT us.setting_id FROM user_setting us WHERE us.user_id = ?

因此,可以遍历用户表中的记录,然后为每条记录执行此操作。

或者,您可以通过学习喜欢笛卡尔联接来扩展这两种方法以包含用户表。我不得不承认我不是mysql专家(我是甲骨文男孩),所以我会尽力为你服务。

笛卡尔连接是两个表(或结果集)之间的连接,其中一个中的每个记录都应该连接到另一个中的每个记录。也就是说,不需要显式关系表之间。

在您的情况下,用户和设置之间的笛卡尔联接将为您提供用户和设置之间所有可能组合的详尽列表,无论您的联接表中是否存在设置。

为你提供所有可能的设置和用户组合的连接将是(在mysql上):

SELECT u.user_id,s.setting_id   来自用户AS u   CROSS JOIN设置AS s

以上两个SQL staments然后更改为:

SELECT u.user_id, s.setting_id
FROM user AS u
CROSS JOIN setting AS s
WHERE (u.user_id, s.setting_id ) NOT IN (SELECT us.user_id, us.setting_id
                                         FROM user_setting AS us)

或(作为Oracle的替代方案)

SELECT u.user_id, s.setting_id
FROM user u, setting s
MINUS
SELECT us.user_id, us.setting_id
FROM user_setting us

请原谅我,如果我的mysql语法不在......

答案 1 :(得分:-1)

想一想你的实际问题,我会说这就是你想要的:

CREATE TRIGGER update_user_settings
AFTER INSERT ON setting
FOR EACH ROW
BEGIN
  INSERT INTO user_settting (setting_id,user_id)
  SELECT new.setting_id, u.user_id FROM user u;
END;