2013-03-03 4 views
5

Ho due tabelle: table_a e table_b. Entrambi contengono una colonna denominata "aperta".Utilizzo di alias mysql per selezionare colonne da 2 tabelle

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

Mi piacerebbe scrivere una query che restituisce il seguente

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

tento la seguente query:

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

Questo restituisce una tabella con tutti i valori di table_b.open per ogni valore di table_a.open

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

Vedo che sto fraintendendo l'uso corretto degli alias qui. Qualche idea?

+0

provare questo: selezionare a.open come open_a, b.open come Open_B da table_a una, table_b b; – MUG4N

+0

ancora ottenendo ogni valore di table_b.open per ogni valore di table_a.open. table_a.open sembra passare al suo valore successivo solo dopo essere stato stampato accanto a ogni valore table_b.open – rocketas

+0

Hai un'altra colonna a cui puoi unirti? –

risposta

6

Non si tratta di un problema di alias. Si sta eseguendo un CROSS JOIN sulla tabella che crea un set di risultati cartesiani.

Questo moltiplica il set di risultati in modo che ogni riga da table_a corrisponda direttamente a ogni riga in table_b.

Se si desidera che le tabelle siano JOIN, è necessario disporre di una colonna per unire le tabelle.

Se si dispone di una colonna a JOIN, allora la query sarà:

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 

Se non si dispone di una colonna che può essere utilizzato per unire su, quindi è possibile creare una variabile definita dall'utente per fare ciò che creerà un numero di riga per ogni riga.

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; 

Vedi SQL Fiddle with Demo

+0

Ah capisco. C'è un modo per aggirare questo? – rocketas

+0

@holiday_cannibalism hai un'altra colonna che potrebbe essere utilizzata per partecipare? – Taryn

+0

@holiday_cannibalism Vedere la mia modifica, è possibile utilizzare una variabile definita dall'utente per generare un valore per unire le tabelle. – Taryn

2

Hai bisogno di una colonna che può essere utilizzato per unire che due tabelle.

Puoi provare a generare una pseudo colonna come numero di riga, ma non sono sicuro che sia ciò che stai cercando di ottenere. Questo dovrebbe sembrare che (può provare in questo momento, ma l'idea è chiara):

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

Avevo effettivamente un'altra colonna (data) e usando – rocketas

+0

Quindi mostra lo schema completo per entrambe le tabelle e dicci come decidi quali righe devono essere combinate insieme. – MarcinJuraszek

+0

'seleziona a.open come open_a, b.apen come open_b da table_a a, table_b b dove a.date = b.date' ha prodotto il risultato corretto. Non sapevo che potresti farlo con il numero di riga però. Grazie. – rocketas