MySQL只需按顺序连接表,而不需要公共列

时间:2013-02-02 16:12:52

标签: mysql sql join

我遇到了另一个问题:

MySQL / PHP Joining tables without always having common column

但是我的桌子没有共同的领域,我只想加入他们“第一个与第一个”,“第二个与第二个”等等。

示例:

TABLE_1

  • 约翰
  • 玛丽
  • 查尔斯

TABLE_2

  • 史密斯
  • 古德曼
  • 衬套

TableResult

  • 约翰|史密斯
  • 玛丽|古德曼
  • 查尔斯|衬套

表格总是应该具有相同的项目数量,但如果没有,则不存在的项目可以填充为null,如“henrry | null”。

也许可以先添加一个字段来为每一行编号,或者其他什么,但这里的性能至关重要。

3 个答案:

答案 0 :(得分:2)

这确实不是一个好主意,并且永远无法保证一致的结果,但您可以获取每个表的行号并将其用作您的加入字段。

尝试这样的事情:

SELECT Field1, Field2
FROM (SELECT Field1, @curRow := @curRow + 1 AS row_number
      FROM Table1
         JOIN    (SELECT @curRow := 0) r) t1
 JOIN (SELECT Field2, @curRow2 := @curRow2 + 1 AS row_number
      FROM Table2
         JOIN    (SELECT @curRow2 := 0) r) t2 on t1.row_number = t2.row_number

这是SQL Fiddle

这仅在两个表具有相同行数时才有效。如果没有,你将丢失数据......

祝你好运。

答案 1 :(得分:0)

如果你想要性能,只需使用整数主键,但你需要键。你不能也不应该按照你描述的方式去做。 :)

答案 2 :(得分:0)

修改

鉴于您的要求专门用于获得随机结果,我认为您可以使用cross join

以下fiddle抓住了我展示这一点的努力。

-

否则,如果您的数据是真正的常量(在这种情况下,您为什么使用数据库?)那么它可以产生一致的结果 - 但您可以轻松定义键并完成它。如果没有,请考虑一下,当您扩展数据库时,您的期望“未存在的[sic]项目可以填充为null”:

之前

表1

foo
bar

表2

qux

<强>结果

foo qux
bar null

表1

foo
bar
baz

表2

qux
quxx

<强>结果

foo qux
bar quxx
baz null

您无法将baz quxx添加到数据库中。