使用 mysql 别名从 2 个表中选择列
Posted
技术标签:
【中文标题】使用 mysql 别名从 2 个表中选择列【英文标题】:Using mysql aliases to select columns from 2 tables 【发布时间】:2013-03-03 20:50:30 【问题描述】:我有 2 个表:table_a 和 table_b。两者都包含一个名为“open”的列。
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_a.open 的每个值返回一个包含每个 table_b.open 值的表
+-------++------+
| open || open |
+-------++------+
| 36.99 || 4.27 |
| 36.99 || 4.46 |
| 36.99 || 4.38 |
| 36.99 || 4.22 |
| ... || 4.18 |
+ ... ++------+
我可以看到我在这里误解了别名的正确用法。有什么想法吗?
【问题讨论】:
试试这个:select a.open as open_a, b.open as open_b from table_a a, table_b b; 仍然为 table_a.open 的每个值获取 table_b.open 的每个值。 table_a.open 似乎只有在打印到每个 table_b.open 值旁边之后才会移动到下一个值 你还有其他专栏可以加入吗? 【参考方案1】:这不是您遇到的别名问题。您正在创建笛卡尔结果集的表上执行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
【讨论】:
啊,我明白了。有没有办法解决这个问题? @holiday_cannibalism 你还有其他专栏可以加入吗? @holiday_cannibalism 查看我的编辑,您可以使用用户定义的变量来生成一个值来加入表格。【参考方案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
【讨论】:
我确实有另一列(日期)并使用 所以显示两个表的整个架构,并告诉我们你如何决定哪些行应该组合在一起。 'select a.open as open_a, b.open as open_b from table_a a, table_b b where a.date = b.date' 产生了正确的结果。不知道你可以用行号来做到这一点。谢谢。以上是关于使用 mysql 别名从 2 个表中选择列的主要内容,如果未能解决你的问题,请参考以下文章