2013-03-03 42 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