2010-07-27 7 views
8

J'essaie de sélectionner des lignes avec un certain nom de colonne et de les ordonner par un autre nom de colonne.MySQL Select, colonne avec le même nom de plusieurs tables, ordre par une autre colonne avec le même nom

Voilà mon problème, en N tables simplifiées:

table 1: id, username, datetime, comment

table 2: id, username, datetime, vote

.

.

.

table N: id, username, datetime, bought

Je veux être en mesure de sélectionner toutes les lignes où username='Some Name', classés par ordre datetime - à travers toutes les tables N.

-

Soit dit en passant, personne ne sait d'un bon livre ou des ressources sur l'apprentissage et la pratique de SQL avancé? (Essayé SQLZoo, mais ils n'ont pas assez d'exemples avancés .. et puis il y a les trop avancés que je suis toujours perplexe sur)

Répondre

7

Si vous cherchez à trier sur toutes les tables en même temps (un record récent du tableau 3 montre avant quelque chose à partir du tableau 2, etc.)

La meilleure façon de le faire sur plusieurs tables serait une 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 

Notez que lorsque vous utilisez une union comme celle-ci, toutes vos instructions select doivent retourner le même nombre de colonnes et avoir le même nom (vous pouvez utiliser des alias comme indiqué ci-dessus dans le tableau 3)

+0

les deux autres personnes suggèrent l'alias comme une possibilité, aussi (bien que je ne sache pas comment ils commandent * tout * par datetime ... si les deux sont possibles, l'alias vs union est-il meilleur en termes de ressources? – ina

+1

Les UNIONs sont la voie à suivre - cela dit, ce n'est pas particulièrement bon pour les ressources puisque vous faites un tas de sous-requêtes et est généralement un signe que vous avez besoin de changer votre schéma de base de données. Notez également que si vous voulez faire quelque chose comme obtenir les 5 enregistrements les plus récents, vous devrez définir une LIMITE 5 dans CHACUNE des sous-requêtes et ensuite limiter sur la requête externe. – AvatarKava

+0

ok, la solution pourrait être juste de créer une table dump_transactions globale qui concatène tout – ina

2

Alias ​​vos tables dans la requête, à savoir.

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

problème est de savoir comment vous commandez tout par datetime? – ina

+0

voulez-vous trier toutes les tables? –

+0

yup, c'est le problème, le tri à travers toutes les N tables. – ina

1

Vous pouvez sélectionner même les noms de colonnes de différentes tables comme:

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

problème est comment commandez-vous * tout * par date-heure? – ina

1

Vous pouvez utiliser SYNDICATS

Sélectionnez doivent être somthing comme ceci:

(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 
Questions connexes