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