SQL 连接排除与另一行具有共享值的行

问题描述 投票:0回答:1

请参考这个数据库小提琴(SQL也粘贴在下面):

https://www.db-fiddle.com/f/bJ5FfufvP9GHPYtBhkywdP/5

我想显示“mpr_metrics”表中没有关联评论的行。但这里有一个问题:如果有一个指标具有关联的评论,并且该评论也与另一个评论共享相同的开始时间,那么它应该从结果集中排除。

例如,小提琴的结果是“3”,但它应该只显示计数“1”,因为只有 1 个指标(id=5)没有审核,并且没有与 start_time 值相同的审核另一篇评论。

CREATE TABLE mpr_metrics (
  id INT,
  start_time TIMESTAMP,
  PRIMARY KEY (id)
);

CREATE TABLE mpr_metrics_reviews (
  id INT,
  metric_id INT,
  PRIMARY KEY (id)
);

INSERT INTO mpr_metrics (id, start_time) values (1, '2024-09-16');
INSERT INTO mpr_metrics (id, start_time) values (2, '2024-09-16');
INSERT INTO mpr_metrics (id, start_time) values (3, '2024-09-09');
INSERT INTO mpr_metrics (id, start_time) values (4, '2024-09-09');
INSERT INTO mpr_metrics (id, start_time) values (5, '2024-09-11');

INSERT INTO mpr_metrics_reviews (id, metric_id) values (1, 1);
INSERT INTO mpr_metrics_reviews (id, metric_id) values (2, 3);

SELECT count(DISTINCT mpr_metrics.start_time) 
FROM mpr_metrics 
LEFT JOIN mpr_metrics_reviews 
    ON mpr_metrics.id = mpr_metrics_reviews.metric_id 
WHERE mpr_metrics_reviews.id is null;
sql mysql
1个回答
0
投票

您需要另一个联接来排除与另一行共享开始时间的行。

SELECT COUNT(distinct m.id) AS count
FROM mpr_metrics AS m
LEFT JOIN mpr_metrics_reviews AS r
    ON m.id = r.metric_id
LEFT JOIN (
  SELECT m.id, m.start_time
  FROM mpr_metrics AS m
  JOIN mpr_metrics_reviews AS r
  ON m.id = r.metric_id
) AS m1 ON m.start_time = m1.start_time
WHERE r.id IS NULL and m1.id IS NULL
© www.soinside.com 2019 - 2024. All rights reserved.