如何从不同的表中获取MySQL中最后插入的行?

如何从不同的表中获取MySQL中最后插入的行?,mysql,Mysql,我的数据库中有很多不同的表,我需要以某种方式从这些表中获取最后插入的行。就像社交网络一样。而且,这些表不是随机的,而是未知的名称,因为它们都是由用户生成的 例如: 我有表:A、B、C和D,每个表中有5k行。 我需要以某种方式从这些表中获取最后一行,并使其按id排序,就像我们在一个简单的查询中所做的那样:“从表a中选择*按id描述排序”,但我正在寻找类似的内容:“从a、B、C、D中选择*按id描述排序” 表具有相同的结构。如果表具有相同的结构,则可以使用union和order by。比如: sel

我的数据库中有很多不同的表,我需要以某种方式从这些表中获取最后插入的行。就像社交网络一样。而且,这些表不是随机的,而是未知的名称,因为它们都是由用户生成的

例如: 我有表:A、B、C和D,每个表中有5k行。 我需要以某种方式从这些表中获取最后一行,并使其按
id
排序,就像我们在一个简单的查询中所做的那样:
“从表a中选择*按id描述排序”
,但我正在寻找类似的内容:
“从a、B、C、D中选择*按id描述排序”


表具有相同的结构。

如果表具有相同的结构,则可以使用union和order by。比如:

select *
from (
    select * from A
    union all
    select * from B    
    union all
    select * from C
) order by id desc
如果表没有相同的结构,则无法从所有表中选择*并对其排序,并且可能需要执行两个查询。首先是:

select id, tableName
    from (
        select id, 'tableA' as tableName from A
        union all
        select id, 'tableB' as tableName from B    
        union all
        select id, 'tableC' as tableName from C
    ) order by id desc
这将为您提供最后的ID和插入它们的表。然后,您需要从每个相应的表中获取行

使用纯Mysql会有点困难。您可以选择如下表名:

从information\u schema.tables中选择table\u name但是仍然如何在语句中使用它们?您需要动态地生成它

动态生成查询的过程可以是这样的(我还没有测试它,但我相信通过一些调试它应该可以工作):


嗨,你在找这个吗?但是,id不是一个很好的列,无法查看不同表中最后更新的id

   select *
    from A
    join B
    on 1=1
    join C
    on 1=1
    join D
    on 1=1
    order by A.id desc

如果每个表的id是单独计算的,则不能按id排序,因此需要计算一个全局id并在所有表上使用它

您可以按如下方式进行操作:

假设您有两个表A、B:

Create Table A(id int NOT NULL auto_increment, name varchar(max), value varchar(max), PRIMARY_KEY(id));
Create Table B(id int NOT NULL auto_increment, name varchar(max), value varchar(max), PRIMARY_KEY(id));
添加另一个id为自动递增主键的表id

Create table IDS (id  int NOT NULL auto_increment, ts Timestamp default CURRENT_TIMESTAMP, PRIMARY_KEY(id));
对于所有表,id列现在应该使用IDS表中的id作为外键,而不是自动递增

Create Table A(id int NOT NULL auto_increment, name varchar(max), value varchar(max), PRIMARY_KEY(id),CONSTRAINT fk_A_id FOREIGN KEY(id) REFERENCE IDS(id) ON DELETE CASCADE ON UPDATE CASCADE);
Create Table B(id int NOT NULL auto_increment, name varchar(max), value varchar(max), PRIMARY_KEY(id),CONSTRAINT fk_A_id FOREIGN KEY(id) REFERENCE IDS(id) ON DELETE CASCADE ON UPDATE CASCADE);
对于每个在插入触发器之前添加的表,触发器应首先将行插入IDS表,然后将
LAST\u insert\u ID
插入表

Create TRIGGER befor_insert_A BEFORE INSERT On A 
FOR EACH ROW
BEGIN
  insert into IDS() values ();
  set new.id = LAST_INSERT_ID();
END

Create TRIGGER befor_insert_B BEFORE INSERT On B 
FOR EACH ROW
BEGIN
  insert into IDS() values ();
  set new.id = LAST_INSERT_ID();
END
现在可以使用union all从所有表创建视图,现在可以按id对v行进行排序,并给出插入的cronlogic顺序

Create view V AS select * from A UNION ALL select * from B
例如,您可以在V上查询最新的10个ID:

select * from V Order by id desc LIMIT 10


另一个选项是为每个表添加时间戳,并按时间戳对视图进行排序。

表的名称未知?呵呵?看来你的方法是正确的wrong@B001ᛦ 是的,我现在还不知道它们的名字,因为它们是随时间动态创建的。我确信有一种方法可以选择当前创建的所有表并将它们放入数组中。不知道表名对您不好,因为这样您要么无法找到它们,要么不得不求助于动态SQL之类的工具来查找它们。@TimBiegeleisen也许我可以“扫描”数据库获取他们的名字并将其放入一个数组?由用户生成的表,你要么对这些用户非常自信,要么非常幸运,拥有比我更好的用户。是的,但它只会根据第一列IDyeah排序,但他会以某种方式获得它们,对吗?动态的或者其他的。。。如果他们永远不为人所知,他将无法从他们中选择对的:)@VeselinDavidov谢谢你,我想这就是我要找的。现在我必须以某种方式获取表名并将它们传递给查询。@VeselinDavidov也许最好创建一个表
E
,并在向
a
B
C
等插入数据时向
E
表插入数据?纯SQL不知道这是否可行。可能是某种过程或用choiceI语言编写程序我添加了一个示例存储过程来动态构建该查询
select * from V Order by id desc LIMIT 10