$stmt = $dbh->prepare("SELECT id FROM table1 UNION SELECT id FROM table2 UNION SELECT id FROM table3 ORDER BY id DESC LIMIT 1");
上面的代码是我自动生成ID
的代码。我想选择最后插入的ID
。我想要做的是我想在三个表上插入最后一个ID。它可以来自三个表中的任何一个。然后我想增加ID
。但问题是我需要知道最后ID
来自哪个表,以便我可以选择另一个字段并记录最后ID
具有某个属性。此属性取决于表,这就是我想要获取表的原因。
答案 0 :(得分:1)
添加一个鉴别器列,并为每个查询使用MAX
聚合函数,以避免对一个巨大的中间结果集进行排序,并使用UNION ALL
set运算符代替UNION
运算符。 (由于每个查询只返回一行,这不会产生太大的影响;但是我们不需要消除重复的行,我们更喜欢UNION ALL
集合运算符来避免不必要的(有时是昂贵的)操作。
这样的东西应该返回你看起来的结果:
( SELECT 'table1' AS source
, MAX(t1.id) AS max_id
FROM table1 t1
)
UNION ALL
( SELECT 'table2' AS source
, MAX(t2.id) AS max_id
FROM table2 t2
)
UNION ALL
( SELECT 'table3' AS source
, MAX(t3.id) AS max_id
FROM table3 t3
)
ORDER BY max_id DESC
LIMIT 1
这将为您提供一个结果集,用于标识具有最大id的表名。
注意:这假定"最后插入的id"由最大值标识。如果两个表具有相同的最大id值,则不确定将返回哪一行。您可以将source
添加到ORDER BY以使其具有确定性:
ORDER BY max_id DESC, source DESC
(实际要求对我来说不清楚;上面的语句应该返回问题中查询返回的相同值,以及一个判断器,它告诉哪个表id
值来自。)
参考:https://dev.mysql.com/doc/refman/5.5/en/union.html
注意:这可能会满足您的使用案例,但在更一般的情况下,我们建议避免这种方法来获取上次插入的行的ID值。
对于自动分配值的auto_increment
列的值,last_insert_id
函数将返回前一个INSERT
语句插入的第一行的id值在同一个会议上。在多用户系统中,不安全地假设"最高" id值是当前会话插入的一行 - 该方法实际上已被破坏。
答案 1 :(得分:0)
尝试获取所有三个表的最后插入ID,并插入时间,然后根据插入的时间进行区分