如何在 MySQL 中从多个表中选择两列并将它们放在一起(没有关系或条件)?

Fun*_*r0n 0 mysql

我需要一个 SQL 语句,它允许我从一个表中获取一列,从另一个表中获取一列,并将它们并排呈现。我一直在仔细研究有关 JOIN 的文献,但它们似乎总是需要一个我不感兴趣的“on”子句。

我发现的最接近的是“NATURAL JOIN”,但这似乎输出的结果为我提供了第 1 列中每一行的第 2 列中的所有行。有什么想法吗?

只是为了说明目的,这就是我想要的......

Table 1

t11
---
 0
---
 1
---
 2

Table 2

t21
---
 a
---
 b
---
 c
Run Code Online (Sandbox Code Playgroud)

期望的结果:

Table 3 (or output of MySQL statement)

t31 | t32
--- | ---
 0  |  a
--- | ---
 1  |  b
--- | ---
 2  |  c
Run Code Online (Sandbox Code Playgroud)

100*_*111 5

您可以尝试这个查询:

SELECT
    T1.a AS from_Table1,
    T2.a AS from_Table2
FROM
    (
        SELECT
            a,
            @rn1 := @rn1 + 1 AS row_number
        FROM t11, (SELECT @rn1 := 0) var
    ) AS T1
INNER JOIN 
    (
        SELECT
            a,
            @rn2 := @rn2 + 1 AS row_number
        FROM t21, (SELECT @rn2 := 0) var
    ) AS T2 
ON T1.row_number = T2.row_number;
Run Code Online (Sandbox Code Playgroud)

SQL FIDDLE 演示


解释:

我在此查询中使用了 mysql 用户定义的变量。

为了理解上面的查询,您需要单独运行这个查询。

SELECT
    a,
    @rn1 := @rn1 + 1 AS row_number
FROM t11, (SELECT @rn1 := 0) var;
Run Code Online (Sandbox Code Playgroud)

该查询将给出以下输出:

从表 t11 可以看出:

a   row_number

0      1
1      2
2      3
Run Code Online (Sandbox Code Playgroud)

看,我已经使用表中的数据创建了一个临时表t11,并为每一行分配了一个数字,即行号(由 mysql 用户定义的变量@rn1)。

看,(SELECT @rn1 := 0) var查询中的这一行是初始化部分。我的意思是它用 value 初始化一次zero。稍后,在每次查找表时,t11变量@rn1都会递增1并与相应行中的列一起打印a。

以同样的方式,我创建了另一个临时表,其中包含数据t21并执行与上面相同的操作。

SELECT
    a,
    @rn2 := @rn2 + 1 AS row_number
FROM t21, (SELECT @rn2 := 0) var;
Run Code Online (Sandbox Code Playgroud)

从表 t21 可以看出:

a   row_number

a      1
b      2
c      3
Run Code Online (Sandbox Code Playgroud)

INNER JOIN现在您需要在这两个表之间创建一些内容( i.e. row_number)。

因此连接这两个表ON row_number并得到预期的结果。

from_Table1     from_Table2

0                   a
1                   b 
2                   c
Run Code Online (Sandbox Code Playgroud)

警告:

由于从表中选择数据时没有任何顺序,因此可能会得到随机结果。我很欣赏在从表格中选择时按某些字段排序。

谢谢。

  • 您需要一些东西来在两个表之间建立关系,而它们之间没有这种关系。这是有时可以在不相关的表之间建立关系的一种方法。 (3认同)
  • @Funktr0n:使用其他一些数据库会更容易,它们具有内置的行编号函数(例如Oracle中的“ROW_NUMBER()”)。正如我在问题下提到的,另一种选择是添加 PK,这样你就有了可以加入的内容。 (2认同)