2013-03-03 3 views
5

У меня есть 2 таблицы: table_a и table_b. Оба содержат столбец с именем «open».Использование mysql-псевдонимов для выбора столбцов из 2 таблиц

table_a 
+-------+ 
| open | 
+-------+ 
| 36.99 | 
| 36.85 | 
| 36.40 | 
| 36.33 | 
| 36.33 | 
+-------+ 

table_b 
+------+ 
| open | 
+------+ 
| 4.27 | 
| 4.46 | 
| 4.38 | 
| 4.22 | 
| 4.18 | 
+------+ 

Я хотел бы написать запрос, который возвращает следующий

+-------++------+ 
| open || open | 
+-------++------+ 
| 36.99 || 4.27 | 
| 36.85 || 4.46 | 
| 36.40 || 4.38 | 
| 36.33 || 4.22 | 
| 36.33 || 4.18 | 
+-------++------+ 

Я пытаюсь следующий запрос:

select a.open, b.open from table_a a, table_b b; 

Это возвращает таблицу со всем значением table_b.open для каждого значения table_a.open

+-------++------+ 
| open || open | 
+-------++------+ 
| 36.99 || 4.27 | 
| 36.99 || 4.46 | 
| 36.99 || 4.38 | 
| 36.99 || 4.22 | 
| ... || 4.18 | 
+ ... ++------+ 

Я вижу, что я неправильно понимаю использование псевдонимов здесь. Есть идеи?

+0

попробовать это: выбрать a.open, как, OPEN_Aсвяжитесь, b.open в open_b из TABLE_A а, б TABLE_B; – MUG4N

+0

все равно получает каждое значение table_b.open для каждого значения table_a.open. Кажется, что table_a.open переходит к следующему значению только после печати рядом с каждым значением table_b.open – rocketas

+0

У вас есть еще один столбец, к которому вы можете присоединиться? –

ответ

6

Это не проблема с псевдонимами, которые у вас есть. Вы выполняете на столе CROSS JOIN, который создает декартовой набор результатов.

Это умножает ваш результирующий набор так, чтобы каждая строка от table_a соответствовала каждой строке в table_b.

Если вы хотите, чтобы таблицы были вместе, вам нужен столбец, чтобы присоединиться к таблицам.

Если у вас есть столбец JOIN дальше, то ваш запрос будет:

select a.open as a_open, 
    b.open as b_open 
from table_a a 
inner join table_b b 
    on a.yourCol = b.yourCol 

Если у вас нет столбец, который можно использовать для соединения с, то вы можете создать пользовательскую переменную для этого, чтобы создать номер строки для каждой строки.

select 
    a.open a_open, 
    b.open b_open 
from 
(
    select open, a_row 
    from 
    (
    select open, 
     @curRow := @curRow + 1 AS a_row 
    from table_a 
    cross join (SELECT @curRow := 0) c 
) a 
) a 
inner join 
(
    select open, b_row 
    from 
    (
    select open, 
     @curRow := @curRow + 1 AS b_row 
    from table_b 
    cross join (SELECT @curRow := 0) c 
) b 
) b 
    on a.a_row = b.b_row; 

См SQL Fiddle with Demo

+0

А я вижу. Есть ли способ обойти это? – rocketas

+0

@holiday_cannibalism У вас есть еще одна колонка, к которой можно было бы присоединиться? – Taryn

+0

@holiday_cannibalism См. Мое редактирование, вы можете использовать определенную пользователем переменную, чтобы сгенерировать значение для объединения таблиц. – Taryn

2

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

Вы можете попытаться создать псевдо-столбец в виде номера строки, но я не уверен, что это то, чего вы пытаетесь достичь. Это должно выглядеть так (можете проверить это прямо сейчас, но идея ясна):

SELECT 
    a.open, b.open 
FROM 
    (SELECT 
     open, @curRow := @curRow + 1 AS row_number 
    FROM 
     table_a 
    JOIN 
     (SELECT @curRow := 0) 
    ) a 
JOIN 
    (SELECT 
     open, @curRow := @curRow + 1 AS row_number 
    FROM 
     table_b 
    JOIN 
     (SELECT @curRow := 0) 
    ) b 
ON 
    a.row_number = b.row_number 
+0

У меня действительно был другой столбец (дата) и с использованием – rocketas

+0

Итак, покажите всю схему для обеих таблиц и скажите нам, как вы решаете, какие строки должны быть объединены вместе. – MarcinJuraszek

+0

'выберите a.open как open_a, b.open как open_b из таблицы_a a, table_b b, где a.date = b.date' дал правильный результат. Не знал, что вы можете сделать это с номером строки. Благодарю. – rocketas

Смежные вопросы