2010-07-27 44 views
8

Tôi đang cố chọn các hàng có tên cột nhất định và sắp xếp chúng theo tên cột khác.Chọn MySQL, cột có cùng tên từ nhiều bảng, sắp xếp theo một cột khác có cùng tên

Dưới đây là vấn đề của tôi, vào N bảng đơn giản:

table 1: id, username, datetime, comment

table 2: id, username, datetime, vote

.

.

.

table N: id, username, datetime, bought

Tôi muốn để có thể chọn tất cả các hàng nơi username='Some Name', sắp xếp theo datetime - trên tất cả các bảng N.

-

Bất ngờ ai biết sách hay tài nguyên học tập và thực hành SQL nâng cao? (Cố gắng SQLZoo, nhưng họ không có đủ ví dụ trước .. và sau đó có những người quá tiên tiến mà tôi vẫn stumped trên)

Trả lời

7

Nếu bạn đang tìm kiếm để sắp xếp trên tất cả các bảng cùng một lúc (một kỷ lục mới từ bảng 3 cho thấy lên trước một cái gì đó từ bảng 2, vv)

cách đơn giản nhất để làm điều này trên nhiều bảng sẽ là một 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 

Lưu ý rằng khi bạn sử dụng một sự kết hợp như thế này, tất cả các báo cáo chọn của bạn nên quay lại cùng một số cột và được đặt tên giống nhau (bạn có thể sử dụng bí danh cho điều này như tôi đã giới thiệu ở trên trong bảng 3)

+0

hai người khác cũng đề xuất bí danh là một khả năng (mặc dù tôi không chắc chắn cách họ đặt hàng * mọi thứ * theo datetime ... nếu cả hai đều có thể, là bí danh và công đoàn tốt hơn về tài nguyên? – ina

+1

Nếu bạn tìm cách đặt hàng qua nhiều bảng không có quan hệ trực tiếp, UNIONs là cách để đi - điều đó không đặc biệt tốt cho tài nguyên vì bạn đang tạo một loạt các truy vấn phụ và thường là dấu hiệu cho thấy bạn cần thay đổi lược đồ cơ sở dữ liệu. Cũng lưu ý rằng nếu bạn muốn làm điều gì đó như nhận 5 bản ghi mới nhất, bạn sẽ cần đặt LIMIT 5 trong M EI truy vấn con và sau đó giới hạn truy vấn bên ngoài. – AvatarKava

+0

ok, giải pháp có thể chỉ là tạo bảng tổng thể dump_transactions kết hợp mọi thứ – ina

2

Bí danh bảng của bạn trong truy vấn, tức là.

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

vấn đề là làm thế nào để bạn đặt tất cả mọi thứ bởi datetime? – ina

+0

bạn có muốn sắp xếp trên tất cả các bảng không? –

+0

yup, đó là vấn đề, phân loại trên tất cả các bảng N. – ina

1

Bạn có thể chọn tên cột tương tự từ các bảng khác nhau như:

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

vấn đề là làm thế nào để bạn đặt hàng * tất cả mọi thứ * bởi datetime? – ina

1

Bạn có thể sử dụng LIÊN HIỆP

Chọn phải somthing như thế này:

(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 
Các vấn đề liên quan