2010-07-27 2 views
8

Я пытаюсь выбрать строки с определенным именем столбца и заказать их по другому имени столбца.MySQL Выберите, столбец с тем же именем из нескольких таблиц, закажите другой столбец с тем же именем

Вот моя проблема, в N упрощенных таблиц:

table 1: id, username, datetime, comment

table 2: id, username, datetime, vote

.

.

.

table N: id, username, datetime, bought

Я хочу, чтобы иметь возможность выбрать все строки, в которых username='Some Name', заказанные DateTime - во всех таблицах N.

-

Кстати, кто-нибудь знает хорошую книгу или ресурс по обучению и практике продвинутого SQL? (Пробовал SQLZoo, но у них нет достаточного количества предварительных примеров .., а затем есть слишком продвинутые, которые я все еще неактивен)

ответ

7

Если вы хотите, чтобы отсортировать по всем таблицам в то же время (новая запись из таблицы 3 видно, перед то из таблицы 2, и т.д.)

Самый простой способ сделать это по нескольким таблицам будет 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 

Обратите внимание, что когда вы используете такой союз, все ваши операторы select должны возвращать одинаковое количество столбцов и называть их одинаковыми (для этого вы можете использовать псевдонимы, как показано выше в таблице 3)

+0

другие два человека также предлагают псевдоним как возможность, хотя я не уверен, как они упорядочивают * все * по дате времени ... если оба возможны, является ли alias vs union лучше с точки зрения ресурсов? – ina

+1

Если вы глядя на порядок в нескольких таблицах, которые не имеют прямых отношений, UNIONs - это путь, который говорит, что это не особенно хорошо для ресурсов, поскольку вы создаете кучу подзапросов и обычно являются признаком того, что вам нужно изменить свою схема базы данных. Также обратите внимание, что если вы хотите сделать что-то вроде получения 5 новейших записей, вам нужно установить LIMIT 5 в каждом из подзапросов, а затем ограничить внешний запрос. – AvatarKava

+0

ОК, решение может состоять только в том, чтобы создать общую таблицу dump_transactions, которая объединяет все – ina

2

Псевдоним ваших таблиц в запросе, т.е.

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

проблема в том, как вы заказываете все по DateTime? – ina

+0

Вы хотите отсортировать по всем таблицам? –

+0

yup, вот в чем проблема, сортировка по всем N таблицам. – ina

1

Вы можете выбрать одни и те же имена столбцов из разных таблиц, таких как:

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

проблема как вы заказываете * все * по дате времени? – ina

1

Вы можете использовать СОЮЗЫ

Выбор должен быть Somthing так:

(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