2010-07-27 37 views
8

Sto provando a selezionare le righe con un determinato nome di colonna e ordinarle in base a un altro nome di colonna.MySQL Seleziona, colonna con lo stesso nome da più tabelle, ordina per un'altra colonna con lo stesso nome

Ecco il mio problema, in N tabelle semplificate:

table 1: id, username, datetime, comment

table 2: id, username, datetime, vote

.

.

.

table N: id, username, datetime, bought

Voglio essere in grado di selezionare tutte le righe in cui username='Some Name', ordinate per datetime - in tutti i tavoli N.

-

Per inciso, qualcuno sa di un buon libro o di risorse per l'apprendimento e la pratica di SQL avanzate? (Ho provato SQLZoo, ma non hanno abbastanza esempi di anticipo .. e poi ci sono quelli troppo avanzati su cui sono ancora sconcertato)

risposta

7

Se stai cercando di ordinare in tutti i tavoli allo stesso tempo (un record più recente dalla tabella 3 mostra prima qualcosa dalla tabella 2, ecc)

Il modo più semplice per farlo su più tavoli sarebbe un UNION:

(SELECT id, username, datetime FROM table 1 WHERE username = 'Some Name') 
UNION 
(SELECT id, username, datetime FROM table 2 WHERE username = 'Some Name') 
UNION 
(SELECT id, somethingelse AS username, date as datetime FROM table 3 WHERE somethingelse = 'Some Name') 
.... 
ORDER BY datetime DESC 

Si noti che quando si utilizza un'unione come questa, tutte le istruzioni selezionate devono restituire lo stesso numero di colonne e essere denominate uguali (è possibile utilizzare alias per questo come mostrato sopra nella tabella 3)

+0

anche le altre due persone suggeriscono alias come possibilità (anche se non sono sicuro di come stiano ordinando * tutto * per datetime ... se entrambi sono possibili, alias vs union è migliore in termini di risorse? – ina

+1

Se sei cercando di ordinare su più tavoli che non hanno relazioni dirette, le UNION sono la strada da percorrere - detto questo, non è particolarmente buono per le risorse dato che stai facendo un sacco di sottoquery e di solito è un segno che devi cambiare il tuo schema del database. Si noti inoltre che se si desidera eseguire un'operazione come ottenere i 5 record più recenti, sarà necessario impostare un LIMIT 5 in OGNI delle sottoquery e quindi limitare anche la query esterna. – AvatarKava

+0

ok, la soluzione potrebbe essere solo creare una tabella dump_transactions che concateni tutto – ina

2

Alias ​​le tue tabelle nella query, es.

SELECT t1.id, t2.username, ... FROM table1 as t1 
+0

problema è come si fa a ordinare tutto da datetime? – ina

+0

vuoi ordinare su tutti i tavoli? –

+0

sì, questo è il problema, l'ordinamento su tutti i tavoli N. – ina

1

È possibile selezionare stessi nomi delle colonne di tabelle diverse, come:

SELECT table1.username as t1user, table2.username as t2user... 
+0

è come si ordina * tutto * per datetime? – ina

1

È possibile utilizzare SINDACATI

Select devono essere somthing come questo:

(SELECT comment, date FROM table1 WHERE username='Some Name') 
UNION 
(SELECT vote, date FROM table2 WHERE username='Some Name') 
... 
UNION 
(SELECT bought, date FROM tableN WHERE username='Some Name') 
ORDER BY date LIMIT 100; 
0
display_error($this->entity); 
     $result = get_leave_status($this->entity); 

     start_table(TABLESTYLE, "width=60%"); 

     $th = array(_("#"), 
      _("Login Date"), 
      _("Login Time"), 
      _("Reason"), 
      _("Status"), 
      _(" "), 

     ); 

     table_header($th); 
      $sl=1; 
      while($sl<13){ 

     display_error($sl); 
     $str = ($sl < 10) ? 0 . $sl : $sl; 
     $sql="SELECT login_time,login_date,early_leave_reason FROM ".TB_PREF."hcm_attendance_".$str." WHERE emp_code=". db_escape($this->entity); 

     $sl++; 
    $result = db_query($sql, "Can't make query in loan_req table."); 



     $k = 0; 
     $i = 1; 
     while ($myrow = db_fetch($result)) { 
      alt_table_row_color($k); 

      label_cell($i,'align=center'); 
      label_cell(sql2date($myrow["login_date"]),'align=center'); 
      label_cell($myrow["login_time"],'align=center'); 



      label_cell($myrow["early_leave_reason"], "Width=30%"); 

      if ($myrow["status"] == 1) 
       label_cell('Approved'); 
      elseif ($myrow["status"] == 2) 
       label_cell('Rejected'); 
      else { 
       label_cell(viewer_link('Pending',"payroll/inquiry/leave_document.php?eno=".$this->vendor_no.'&lid='.$myrow['id'])); 

       edit_button_cell("{$this->name}Edit[{$myrow['id']}]", _("EDIT")); 
      } 
      end_row(); 
      $i++; 
     } 

      } 
     end_table(1); 

here i have used $sl to increment table name like 0_hcm_attendance_01,0_hcm_attendance_02 -------to 0_hcm_attendance_12 

here TB_PREF=0; 

TB_PREF."hcm_attendance_".$str 
Problemi correlati