mysql - 连接表本身,无需两个查询

标签 mysql sql join cross-join

我见过有人建议通过这样做来交叉连接表本身:

SELECT *
FROM tbl AS A, tbl AS B
WHERE A.col1 = 1 AND B.col1 = 1

但是在这里,引擎需要迭代 tbl 中的所有行两次,以将两个查询与 A 和 B 的结果匹配,尽管查询(以及结果)是相同的。

假设 A 和 B 上的 WHERE 对于两者而言始终相同,这是一种浪费。有没有什么方法可以查询某件事一次,然后将该查询的结果交叉连接到其本身?我想避免临时表,这需要磁盘写入而不是在 RAM 中执行整个操作。

我正在使用 MySQL,尽管任何 SQL 答案都会有很大帮助。

示例:

假设 tbl 如下所示:

COL1    COL2
1       A
1       B
1       C
2       D
2       E

当我运行 col1 = 1 的 where 子句时,它返回上表中的前三行。我想要的是下表,但只执行一次 where 语句,因为两个表 A 和 B 是相同的:

A.COL1    A.COL2    B.COL1    B.COL2
1         A         1         A
1         A         1         B
1         A         1         C
1         B         1         A
1         B         1         B
1         B         1         C
1         C         1         A
1         C         1         B
1         C         1         C

最佳答案

您基本上是在要求有意的笛卡尔连接

select
      a.col1,
      a.col2,
      b.col1,
      b.col2
   from
      tbl a
         join tbl b
            on a.col1 = b.col1
   where
      a.col1 = 1
   order by
      a.col2,
      b.col2

要准确命中输出顺序,您需要按“a”第 2 列排序,然后按“b”第 2 列排序

关于mysql - 连接表本身,无需两个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9611843/

相关文章:

计算h-score(h-index)的SQL

SQLite "INDEXED BY"在 SELECT 中不工作

mysql - 如何删除mysql数据库中多个表的数据?

mysql - 使用 SUM() 在 3 个表上进行 INNER JOIN

mysql - 哪个更快 - 从 n 列中获取具有大小 t 的单个值的列,或从 1 列中获取大小为 n*t 的列?

php - 在 Codeigniter 中获取具有相同电子邮件地址域的用户的最佳方法是什么?

php - 在 CodeIgniter 中处理大量的半相关表单

php - Mandrill SMTP HTML 模板电子邮件发送

Mysql JOIN with IN 和 RIGHT 表的多个结果

postgresql - 如何改进查询以选择具有 MAX 日期且在 PostgreSQL 中使用联接表的记录?