我有一个与其他两个表有多对多关系的表:
CREATE TABLE assoc (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ref1 INT NOT NULL,
ref2 INT NOT NULL,
INDEX composite_key (ref1, ref2)
);
我想确定是否存在与ref1匹配且与ref2的给定值不匹配的关联。举个例子,假设我想匹配ref1的关联,值为1000,ref2的任何其他值:
INSERT INTO assoc (ref1, ref2) VALUES
(100, 10),
(100, 1000);
但是,如果只有值1000与ref1相关联,或者它只是任何其他值,则不应该给出匹配:
INSERT INTO assoc (ref1,ref2) VALUES
(101, 10),
(102, 1000);
我想出了两个解决方案。 1)创建一个临时表,其中包含与该值匹配的行的结果,然后从那些与该值不匹配的行中选择SELECT,以及2)加入同一个表,并从该表中指定不匹配的条件。
CREATE TEMPORARY TABLE set
SELECT ref1 FROM assoc
WHERE ref2 = 1000;
SELECT assoc.ref1 FROM `set`
JOIN assoc ON `set`.ref1 = assoc.ref1
WHERE assoc.ref2 <> 1000;
SELECT assoc.ref1 FROM assoc
JOIN assoc AS `set` ON assoc.ref1 = `set`.ref1
WHERE assoc.ref2 = 1000 AND `set`.ref2 <> 1000;
但是,我想知道是否有其他方法可以完成这场比赛?
答案 0 :(得分:1)
我认为你的第二个解决方案是做你想做的事情的标准方法;我也是这样做的。您还正确添加了INDEX composite_key
。但是,您可以添加一个额外的GROUP BY
,以避免在连接找到与ref2&lt;&gt;关联的行时多次出现相同的assoc.ref1。 1000:
SELECT assoc.ref1 FROM assoc
JOIN assoc AS `set` ON assoc.ref1 = `set`.ref1
WHERE assoc.ref2 = 1000 AND `set`.ref2 <> 1000
GROUP BY assoc.ref1;