Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Truy vấn một cơ sở dữ liệu với kết quả từ nhiều bảng?

Ví dụ chung (trong PHP):

Việc xây dựng SQL động hoặc xây dựng các truy vấn SQL của bạn với sự hỗ trợ của một ngôn ngữ lập trình sẽ trông như thế này (ví dụ:trong PHP):

$pdos = $pdo->query("SHOW TABLES LIKE '%_name'");
$tables = $pdos->fetchAll();

$query = 'SELECT * FROM '.implode(' UNION SELECT * FROM ');
$pdo->query($query);

fetchAll phương thức sẽ trả về một mảng chứa tên của mỗi bảng đã chọn.

implode($glue, $array) hàm nhận một mảng và nối mọi giá trị trong mảng bằng cách sử dụng $glue tham số - thông thường bạn lấy một mảng giá trị và mã hóa chúng bằng cách sử dụng $glue = ',' để tạo danh sách các giá trị được phân tách bằng dấu hôn.

Trong trường hợp của chúng tôi, implode có một phần truy vấn là $glue để tạo một UNION JOIN lớn truy vấn.

Sau khi $query cuối cùng là xây dựng nó sẽ trông giống như sau:

SELECT * FROM table_1_name
    UNION
SELECT * FROM table_2_name
    UNION
SELECT * FROM table_3_name
    ....
    ....
    UNION
SELECT * FROM table_4000_name

Kết quả phải chứa tất cả DISTINCT hàng từ tất cả 4000 bảng.

Ví dụ cụ thể (ở định dạng chỉ SQL):

SELECT    GROUP_CONCAT(
              CONCAT('select * from ', table_name)
              SEPARATOR ' union '
          )
    INTO  @my_variable
    FROM  information_schema.tables
    WHERE table_schema = 'dbname'
    AND   table_name LIKE '%_name';

PREPARE   my_statement FROM @my_variable;
EXECUTE   my_statement;
  • Câu lệnh đầu tiên sẽ lấy tất cả các tên bảng từ information_schema cơ sở dữ liệu;
  • CONCAT tiền tố của mỗi tên bảng bằng một 'SELECT * FROM ' chuỗi;
  • GROUP_CONCAT thực hiện công việc mà implode lẽ ra phải làm bằng PHP;
  • INTO mệnh đề đảm bảo các giá trị được lưu bên trong một biến có tên my_variable;

  • PREPARE câu lệnh nhận một giá trị chuỗi (chẳng hạn như giá trị bạn đã lưu trong my_variable ) và kiểm tra xem giá trị có phải là truy vấn SQL hay không;

  • EXECUTE câu lệnh có một "câu lệnh chuẩn bị" và ... thực thi nó.

@my_variable là một biến tạm thời nhưng nó chỉ có thể thuộc loại vô hướng (varchar, int, date, datetime, binary, float, double, v.v.) nó không một mảng.

GROUP_CONCAT hàm là một "hàm tổng hợp" có nghĩa là nó nhận một giá trị tổng hợp (khái niệm tương tự như một mảng - trong trường hợp của chúng tôi là tập kết quả của truy vấn của chúng tôi) và xuất ra một kết quả chuỗi đơn giản.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhập MS ACCESS DB vào mySql?

  2. mysql làm thế nào để cập nhật một cột của mọi hàng với một bộ giá trị nhất định

  3. Perl DBI fetchall_hashref

  4. Trả về ký tự đầu tiên DISTINCT của một trường (MySQL)

  5. Java, làm thế nào để thay đổi cơ sở dữ liệu hiện tại sang cơ sở dữ liệu khác?