Select匹配到两列子查询

Select matching to two columns of subquery

背景:

给定 table t1 的字段 A、B(和其他):

DROP TEMPORARY TABLE IF EXISTS t1; 
CREATE TEMPORARY TABLE t1 (ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, A varchar(255), B int, C varchar(40));

INSERT INTO t1 (A, B, C)
SELECT 'AA', 11, 100
UNION ALL
SELECT 'BB', 12, 200
UNION ALL
SELECT 'BB', 12, 201
UNION ALL
SELECT 'AA', 12, 300
UNION ALL
SELECT 'AA', 11, 101;

-- ID  A  B  C
--  1  AA 11 100
--  2  BB 12 200
--  3  BB 12 201
--  4  AA 12 300
--  5  AA 11 101

目标:对于给定的 A 和 B 组合, 检查 t1 中有多少行,然后列出所有这些行(以了解什么是相同的,什么是这些行之间不同)。

(最后,但超出了这个问题的范围,将编写查询来处理一些的旧行,这些行被确定为"obsolete"(替换通过给定 A 和 B 的最近一行)。此时对 A 和 B 的所有组合这样做是不安全的。我无法获得关于 "what combinations of A and B are safe to delete old version of" 的明确答案 - 这是遗留 table 它与许多 GB 的外部文件相关联,其中大部分与任何人都不再相关。所有这些文件都已备份;我需要就删除哪些文件以及如何删除提出一个保守的建议确定了那些文件。)

我用 A 和 B 的所有不同组合制作了 temp table t2(加上一个 ID,以及每个组合的行数) :

DROP TEMPORARY TABLE IF EXISTS t2; 
CREATE TEMPORARY TABLE t2 (ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, A varchar(255), B int)
SELECT COUNT(1) As Cnt, A, B FROM t1
GROUP BY A, B
ORDER BY Cnt DESC;

SELECT * 从 t2

-- ID  Cnt  A  B
--  1    2  AA 11
--  2    2  BB 12
--  3    1  AA 12

我写的查询有问题:

在实际数据中,某些组合有数百行。我对计数高的组合最感兴趣,因此我尝试根据 t2 的第一行转储 t1 的行:

SELECT * FROM t1
WHERE A=
    (SELECT A from t2 LIMIT 1 OFFSET 0) AND
    B=
    (SELECT B from t2 LIMIT 1 OFFSET 0);

这给出了错误:

Error Code: 1137. Can't reopen table: 't2'

我想我应该从 t2 中引用我想要的行:

(SELECT A, B from t2 LIMIT 1 OFFSET 0)

然后在使用A列和B列的两个地方进行两次使用该行的嵌套查询。我坚持如何编写此查询。我脑子里的基本想法是:

SELECT * FROM t1
    WHERE A=t3.A AND B=t3.B IN
        (SELECT A, B from t2 LIMIT 1 OFFSET 0) AS t3;

(无效 SQL)

注意:"OFFSET 0" 在那里,因为那时我将更改为其他偏移值,以检查其他 A-B 组合。

目标是看回复:

-- ID  A  B  C
--  1  AA 11 100
--  5  AA 11 101

或者这可以用 JOIN 来完成,但我不确定如何仅使用 t2.

的一行来进行 JOIN

你可以这样做:

  SELECT t1.*
    FROM t1
    JOIN ( SELECT t2.A, t2.B
             FROM t2
            ORDER BY t2.A, t2.B
            LIMIT 1 OFFSET 0
         ) t3
   WHERE t3.A = t1.A
     AND t3.B = t1.B

没有 ORDER BY 子句,MySQL 可以自由 return 任何行。我们需要添加 ORDER BY 以使结果具有确定性。