【问题标题】:Match when column does and does not equal value across multiple rows当列在多行中等于和不等于值时匹配
【发布时间】:2013-04-12 15:57:18
【问题描述】:

我有一个与其他两个表具有多对多关系的表:

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)使用与值匹配的行的结果创建一个临时表,然后从中选择不匹配该值的行,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;

但是,我想知道是否还有其他方法可以完成这场比赛?

【问题讨论】:

    标签: mysql many-to-many self-join multiple-records


    【解决方案1】:

    我认为你的第二个解决方案是做你想做的事的标准方法;我也会这样做。您还正确添加了INDEX composite_key 。但是,您可以添加一个额外的GROUP BY 以避免相同的 assoc.ref1 出现的次数与连接找到 ref2 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;
    

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 2013-03-03
      • 1970-01-01
      • 2021-08-31
      相关资源
      最近更新 更多