2016-02-01 3 views
5

私はmysqlで新しく、助けが必要です。Mysqlは、複数のテーブルのMax(id)を1つの特定のテーブルの1つの値と共に返します。

私のデータベースには10個のテーブルがあります。それらのオン

は「休止」と命名され、スキーマは次のようである。この

enter image description here

コラム「実体は、」データベース内の他のテーブルの名前が含まれています。テーブルの

  1. テーブル名
  2. MAX(ID)
  3. next_hi列の値:私は必要なもの

    は3列で、各テーブルのために私に1行を返しますクエリですテーブルの休止状態テーブルの

このように:

enter image description here

それが各テーブルを「休止」と「実体」欄からテーブル名をピックアップし、そのテーブル名のためMAXIDを取得し、「next_hi」も

EDITと上の写真のような行を返すために行うことができればそれは素晴らしいことです。

"hibernate"テーブル からテーブル名を読み込むことができない場合は、クエリでhardocedされたテーブル名を使ってこれを行うこともできます。

私は、私は1つのテーブル「アカウント」のために作られた例があります。

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

From Account 

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

をしかし、今、私は複数のテーブルのためにこれを戻すには、このクエリを変更する方法がわかりません。私にとって

+0

質問は「なぜ?」おもう... ;あなたがするべきではない何かのようなこの音... – Blag

+0

正直言って、私は理由を知らない:)仕事に対する私の仕事の1つは、このクエリを構築することです。それは何かのために使用されますが、私は何のために知っていません – carpics

+0

作業する最善の方法ではない...;いつでも、あなたの投稿の 'sql-server'タグを削除し、' sql'を追加してください。 – Blag

答えて

1

最善の方法は、トリガである:

-- 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 ; 

すべてのテーブルの上にあなたのhibernateテーブルの上にlast_idフィールドを更新この単純なトリガーを置きます。何をしたいあなたを与えるだろうこの単純なselect * from hibernate

...


しかし、これは実際に最適化されていません。それは働く。このデータが必要なときは、それに依存します。多分、ハードコーディングされたバージョンが良いです...

あなたがハードコーディングされたと一緒に行きたい場合は、次の

(
    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

ハードコーディングされたバージョンは私には良いでしょう。複数のテーブルの仕事をするスクリプトを書いてmiを助けることができれば。 – carpics

+0

ハードコードされたバージョンで@carpicsを更新 – Blag

+0

ありがとう、これは動作します。申し訳ありませんが、データベース内のすべてのテーブルをループして、これを行う方法はありますか?データベースに20個のテーブルがある場合、これは本当に大きなスクリプトになるためです。 – carpics

関連する問題