MySQL объединить номер строки (первый с первым, второй со вторым и т. Д. c) - PullRequest
0 голосов
/ 05 марта 2020

Допустим, у меня есть две простые таблицы

Table t1    Table t2
+------+    +------+
| i    |    | j    |
+------+    +------+
|   42 |    |    a |
|    1 |    |    b |
|    5 |    |    c |
+------+    +------+

Как получить выходные данные двух таблиц, объединенных без каких-либо условий, кроме номера строки?

Я бы хотел избежать создание другого индекса, если это возможно.

Я использую MySQL 5.7


В этом примере вывод будет:

Table output
+------+------+
| i    | j    |
+------+------+
|   42 |    a |
|    1 |    b |
|    5 |    c |
+------+------+

Ответы [ 3 ]

1 голос
/ 05 марта 2020

То, что вы спрашиваете можно сделать, предполагая, что ваш комментарий верен;

"Даже если таблица i и j являются подзапросами (содержащими порядок по)?"

Схема (MySQL v5.7)

CREATE TABLE table_1 ( i INT );
CREATE TABLE table_2 ( j VARCHAR(4) );

INSERT INTO table_1
VALUES (3),(5),(1);

INSERT INTO table_2
VALUES ('c'), ('b'),('a');

Запрос

SELECT t1.i, t2.j
FROM (SELECT t1.i
           , @rownum1 := @rownum1 + 1 AS rownum
      FROM (SELECT table_1.i
            FROM table_1
            ORDER BY ?) t1
               CROSS JOIN (SELECT @rownum1 := 0) v) t1
         JOIN (SELECT t2.j
                    , @rownum2 := @rownum2 + 1 AS rownum
               FROM (SELECT table_2.j
                     FROM table_2
                     ORDER BY ?) t2
                        CROSS JOIN (SELECT @rownum2 := 0) v) t2 ON t2.rownum = t1.rownum;

Однако этот подход а) неэффективен и б) свидетельствует о сомнительном дизайне. Вы, вероятно, хотите найти что-то, что на самом деле связывает ваши две таблицы или, если ничего не существует, создать что-то Если на самом деле нет ничего связывающего эти две таблицы, то у вас все равно будут проблемы с предложениями ORDER BY.

1 голос
/ 05 марта 2020

Если таблицы не обязательно имеют одинаковое количество строк, тогда используйте union all и group by - вместе с переменными:

select max(t.i) as i, max(t.j) as j
from ((select (@rn1 := @rn1 + 1) as seqnum, t1.i
       from t1 cross join
            (select @rn1 := 0) params
      ) union all
      (select (@rn2 := @rn2 + 1) as seqnum, t2.j
       from t2 cross join
            (select @rn2 := 0) params
      ) 
     ) t
group by seqnum;

Примечание: результаты в каждом столбце находятся в произвольный и неопределенный порядок. Порядок может отличаться при разных прогонах запроса.

Вы не предоставили достаточно информации для обеспечения порядка.

0 голосов
/ 05 марта 2020

Вы можете попробовать этот код

select t1.i,t2.j
from
    (SELECT i,@row_num:=@row_num+1 as row_num FROM t1, (SELECT @row_num:= 0) AS sl) t1
join
    (SELECT j,@row_num:=@row_num+1 as row_num FROM t2, (SELECT @row_num:= 0) AS sl) t2
on  t1.row_num=t2.row_num
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...