Mysql返回多个表的Max(id)以及一个特定表中的一个值

时间:2016-02-01 23:37:29

标签: mysql sql

我是mysql的新手,我需要一些帮助。

我的数据库中有10个表。

他们被命名为" hibernate"和架构是这样的

enter image description here

专栏"实体"包含数据库中其他表的名称。

我需要的是查询,它会为每个表返回一行,有3列:

  1. 表名称
  2. 表格的最大值(id)
  3. 表hibernate表中next_hi列的值
  4. 像这样:

    enter image description here

    如果它可以为每个" hibernate"做它会很棒。表并从"实体"中获取TableName。列和获取该TableName的MaxId并返回如上图所示的行" next_hi"还

    编辑:

    如果通过阅读" hibernate"中的表名来解决这个问题是不可能的。表 如果我可以使用Query中的表名来处理这个名称,那么它也会有所帮助。

    我有一个我为一张桌子做的例子"帐户":

    SELECT  
    hibernate.entity as TableName, 
    hibernate.next_hi, 
    MAX(Account.Id) as MaxId
    
    From Account 
    
    INNER JOIN hibernate
        ON "Account"=hibernate.entity;
    

    但现在我不知道如何修改此查询以便为多个表返回此内容。

1 个答案:

答案 0 :(得分: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 ;

在每张桌子上放置这个简单的触发器,用于更新last_id表格上的hibernate字段。

通过这个简单的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