2013-03-03 26 views
5

Tôi có 2 bảng: table_a và table_b. Cả hai đều chứa một cột có tên 'mở'.Sử dụng bí danh mysql để chọn các cột từ 2 bảng

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 | 
+------+ 

Tôi muốn viết một truy vấn mà trả về sau

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

tôi cố gắng truy vấn sau đây:

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

này trả về một bảng với mỗi giá trị của table_b.open cho mỗi giá trị của table_a.open

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

Tôi có thể thấy tôi hiểu nhầm cách sử dụng bí danh ở đây. Ý tưởng nào?

+0

thử cách này: select a.open as open_a, b.open as open_b from table_a a, table_b b; – MUG4N

+0

vẫn nhận được mọi giá trị của table_b.open cho mỗi giá trị của table_a.open. table_a.open dường như chỉ chuyển sang giá trị tiếp theo sau khi được in bên cạnh mỗi giá trị table_b.open – rocketas

+0

Bạn có một cột khác mà bạn có thể tham gia không? –

Trả lời

6

Đây không phải là vấn đề bí danh mà bạn có. Bạn đang thực hiện một CROSS JOIN trên bảng tạo ra một tập kết quả Descartes.

Điều này nhân kết quả của bạn được đặt để mỗi hàng từ table_a được đối sánh trực tiếp với mỗi hàng trong table_b.

Nếu bạn muốn JOIN các bảng với nhau, thì bạn cần một số cột để nối các bảng.

Nếu bạn có một cột để JOIN trên, sau đó truy vấn của bạn sẽ là:

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 

Nếu bạn không có một cột có thể được sử dụng để tham gia vào, sau đó bạn có thể tạo một biến người dùng định nghĩa để làm điều này sẽ tạo ra một số hàng cho mỗi hàng.

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; 

Xem SQL Fiddle with Demo

+0

Ah tôi hiểu rồi. Có cách nào để giái quyết vấn đề này không? – rocketas

+0

@holiday_cannibalism bạn có một cột khác có thể được sử dụng để tham gia không? – Taryn

+0

@holiday_cannibalism Xem chỉnh sửa của tôi, bạn có thể sử dụng biến do người dùng xác định để tạo giá trị để tham gia các bảng. – Taryn

2

Bạn cần một cột có thể được sử dụng để tham gia mà hai bảng.

Bạn có thể thử tạo một cột giả làm số hàng, nhưng tôi không chắc chắn đó là những gì bạn đang cố gắng đạt được. Điều này sẽ giống như vậy (có thể kiểm tra nó ngay bây giờ, nhưng ý tưởng là rõ ràng):

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

Tôi thực sự có cột khác (ngày) và sử dụng – rocketas

+0

Vì vậy, hãy hiển thị toàn bộ lược đồ cho cả hai bảng và cho chúng tôi biết cách bạn quyết định nên kết hợp các hàng nào với nhau. – MarcinJuraszek

+0

'chọn a.open như open_a, b.open như open_b từ table_a a, table_b b trong đó a.date = b.date' mang lại kết quả chính xác. Không biết bạn có thể làm điều đó với số hàng mặc dù. Cảm ơn. – rocketas

Các vấn đề liên quan