2010-07-27 24 views
8

Estoy tratando de seleccionar filas con un cierto nombre de columna y ordenarlas por otro nombre de columna.MySQL Seleccionar, columna con el mismo nombre de varias tablas, ordenar por otra columna con el mismo nombre

Aquí es mi problema, en N tablas simplificadas:

table 1: id, username, datetime, comment

table 2: id, username, datetime, vote

.

.

.

table N: id, username, datetime, bought

Quiero ser capaz de seleccionar todas las filas en username='Some Name', ordenadas por fecha y hora - a través de todas las tablas N.

-

Por cierto, ¿alguien sabe de un buen libro o recurso en el aprendizaje y la práctica de SQL avanzado? (Intenté SQLZoo, pero no tienen suficientes ejemplos de avance ... y luego están los muy avanzados que todavía estoy perplejo)

Respuesta

7

Si usted está buscando para ordenar a través de todas las mesas al mismo tiempo (un nuevo registro de la tabla 3 muestra antes algo de la tabla 2, etc)

La forma más sencilla de hacerlo a través de múltiples tablas sería una 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 

Tenga en cuenta que cuando usa una unión como esta, todas sus declaraciones seleccionadas deben devolver el mismo número de columnas y ser nombradas igual (puede usar alias para esto como mostré en la tabla 3)

+0

las otras dos personas también sugieren alias como una posibilidad (aunque no estoy seguro de cómo están ordenando * todo * por fecha y hora ... si ambas son posibles, ¿alias vs unión es mejor en términos de recursos? – ina

+1

Si está buscando hacer pedidos en múltiples tablas que no tienen relaciones directas, los UNION son el camino a seguir; dicho esto, esto no es especialmente bueno para los recursos ya que está haciendo un montón de subconsultas y generalmente es una señal de que necesita cambiar su esquema de base de datos. También tenga en cuenta que si desea hacer algo como obtener los 5 registros más nuevos, deberá establecer un LÍMITE 5 en CADA una de las subconsultas y luego limitar la consulta externa también. – AvatarKava

+0

bien, la solución podría ser solo crear una tabla dump_transactions general que concatena todo – ina

2

Alias ​​sus tablas en la consulta, es decir.

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

problema es cómo se puede pedir todo por la fecha y hora? – ina

+0

¿desea ordenar en todas las tablas? –

+0

yup, ese es el problema, clasificando en todas las N tablas. – ina

1

Puede seleccionar mismos nombres de columna de tablas diferentes como:

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

problema es ¿cómo pides * todo * por fecha y hora? – ina

1

Puede usar SINDICATOS

seleccione debe ser algo como esto:

(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 
Cuestiones relacionadas