2013-03-03 83 views
5

我有2個表:table_a和table_b。兩者都包含一個名爲'open'的列。使用mysql別名從兩個表中選擇列

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從表-A一,表-B b open_b; – MUG4N 2013-03-03 20:52:22

+0

仍然爲table_a.open的每個值獲取table_b.open的每個值。 table_a.open似乎只能在每個table_b.open旁邊打印後才轉移到下一個值 – rocketas 2013-03-03 20:55:43

+0

您是否有另一列可以加入它們? – 2013-03-03 20:58:23

回答

6

這不是一個別名問題,你有。您正在執行CROSS JOIN創建笛卡爾結果集的表上。

這會使您的結果集倍增,因此table_a中的每一行都會與table_b中的每一行直接匹配。

如果你想把JOIN的表加在一起,那麼你需要一些列來加入表。

如果你有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 2013-03-03 20:57:07

+0

@holiday_cannibalism你有另外一列可以用來加入嗎? – Taryn 2013-03-03 20:58:58

+0

@holiday_cannibalism查看我的編輯,您可以使用用戶定義的變量來生成一個值來加入表上。 – Taryn 2013-03-03 21:08:38

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 2013-03-03 21:09:03

+0

因此,顯示兩個表的整個模式,並告訴我們如何決定哪些行應該組合在一起。 – MarcinJuraszek 2013-03-03 21:10:21

+0

'從table_a a,table_b b選擇a.open作爲open_a,b.open作爲open_b,其中a.date = b.date'取得了正確的結果。不知道你可以用行號來做到這一點。謝謝。 – rocketas 2013-03-03 21:11:24