2016-02-01 14 views
5

Tôi mới sử dụng mysql và tôi cần trợ giúp.Mysql trả về Max (id) cho nhiều bảng cùng với một giá trị từ một bảng cụ thể

Tôi có 10 bảng trong cơ sở dữ liệu của mình.

On trong số họ được đặt tên là "ngủ đông" và giản đồ là như

enter image description here

Cột "thực thể" này chứa tên của các bảng khác trong cơ sở dữ liệu.

Những gì tôi cần là truy vấn mà sẽ trả lại cho tôi một hàng cho mỗi bảng, với 3 cột:

  1. tên bảng
  2. max (id) của bảng
  3. giá trị của cột next_hi trong bảng ngủ đông cho bảng

như thế này:

enter image description here

Nó sẽ là tuyệt vời nếu nó có thể làm cho mỗi bảng "ngủ đông" và nhặt TableName từ cột "thực thể" và nhận được MaxId cho TableName đó và trở lại hàng như hình trên với "next_hi" cũng

EDIT:

Nếu không thể thực hiện điều này bằng cách đọc tên bảng từ bảng "hibernate" nó cũng sẽ giúp ích nếu tôi có thể làm việc này với tên bảng được truy vấn trong truy vấn.

Tôi có ví dụ mà tôi thực hiện cho một "Tài khoản" bảng:

SELECT 
hibernate.entity as TableName, 
hibernate.next_hi, 
MAX(Account.Id) as MaxId 

From Account 

INNER JOIN hibernate 
    ON "Account"=hibernate.entity; 

Nhưng bây giờ tôi không biết làm thế nào để sửa đổi truy vấn này để trả lại này cho nhiều bảng.

+0

Câu hỏi đặt ra là Tôi nghĩ... ; âm thanh này giống như một cái gì đó bạn không cần phải làm ... – Blag

+0

Thành thật mà nói, tôi không biết tại sao :) Một trong những nhiệm vụ của tôi trong công việc là xây dựng truy vấn này. Nó sẽ được sử dụng cho một cái gì đó nhưng tôi không biết những gì – carpics

+0

không phải là cách tốt nhất để làm việc ...; bất cứ khi nào, loại bỏ các 'sql-server' tag của bài viết của bạn và thêm một' sql' xin vui lòng – Blag

Trả lời

1

Cách tốt nhất đối với tôi là với kích hoạt:

-- change end of line DELIMITER 
DELIMITER // 

DROP TRIGGER IF EXISTS `trg_account_last_id`; 
// 

CREATE TRIGGER `trg_account_last_id` 
AFTER INSERT ON `Account` 
FOR EACH ROW 
BEGIN 

    UPDATE `hibernate` 
    SET `hibernate`.`last_id` = NEW.`id` 
    WHERE `hibernate`.`entity` = 'Account'; 

END; 
// 

DELIMITER ; 

Trên mỗi bảng bạn đặt bẫy này đơn giản mà cập nhật một lĩnh vực last_id trên bàn hibernate của bạn.

Với điều này một cách đơn giản select * from hibernate sẽ cung cấp cho bạn những gì bạn muốn ...


Nhưng điều này là không thực sự tối ưu. Nó hoạt động. Sau khi nó phụ thuộc khi bạn cần dữ liệu này. có lẽ một phiên bản được mã hóa cứng là tốt hơn ...

Nếu bạn muốn đi với các mã hóa cứng: "Tại sao?"

(
    SELECT 
    `hibernate`.`entity` as `TableName`, 
    `hibernate`.`next_hi`, 
    (SELECT MAX(`Id`) FROM `Account`) as `MaxId` 
    FROM `hibernate` 
    WHERE `hibernate`.`entity` = "Account" 
) 
UNION ALL (
    SELECT 
    `hibernate`.`entity` as `TableName`, 
    `hibernate`.`next_hi`, 
    (SELECT MAX(`Id`) FROM `Page`) as `MaxId` 
    FROM `hibernate` 
    WHERE `hibernate`.`entity` = "Page" 
) 
UNION ALL (
    SELECT 
    `hibernate`.`entity` as `TableName`, 
    `hibernate`.`next_hi`, 
    (SELECT MAX(`Id`) FROM `User`) as `MaxId` 
    FROM `hibernate` 
    WHERE `hibernate`.`entity` = "User" 
) 
-- and again for other tables 
+0

Cũng cứng mã hóa phiên bản sẽ tốt hơn cho tôi.Nếu bạn có thể giúp mi bằng cách viết kịch bản sẽ thực hiện công việc cho nhiều bảng. – carpics

+0

@carpics cập nhật với phiên bản mã hóa cứng – Blag

+0

Cảm ơn, công trình này. Xin lỗi nhưng tôi phải hỏi là có bất kỳ cách nào để lặp qua tất cả các bảng trong cơ sở dữ liệu và làm điều này, bởi vì nếu cơ sở dữ liệu của tôi có 20 bảng này sẽ là kịch bản thực sự lớn. – carpics

Các vấn đề liên quan