UNION mysql 判断结果来自哪个table

UNION mysql determine which table the result came from

$stmt = $dbh->prepare("SELECT id FROM table1 UNION SELECT id FROM table2 UNION SELECT id FROM table3 ORDER BY id DESC LIMIT 1");

上面的代码是我自动生成的代码ID。我要select最后插入ID。我想要做的是我想要在三个 table 上插入最后一个 ID。它可以来自三个 table 中的任何一个。然后我想增加 ID。但要注意的是,我需要知道最后一个 ID 来自哪个 table,这样我就可以 select 另一个字段并记录最后一个 ID 具有特定属性。此属性取决于 table 这就是为什么我想获得 table.

尝试获取所有三个表的最后插入 ID 和插入时间,然后根据插入时间进行区分

添加鉴别器列,并为每个查询使用MAX 聚合函数以避免对巨大的中间结果集进行排序,并使用UNION ALL 集合运算符代替UNION 运算符。 (因为每个查询只会 return 一行,所以不会有太大区别;但是在我们不需要消除重复行的地方,我们更喜欢 UNION ALL 集合运算符来避免不必要的(有时是昂贵的)操作。

这样的事情应该 return 您似乎想要的结果:

( 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 的 table 名称。

注意:这假定 "last inserted id" 由最大值标识。如果两个 table 具有相同的最大 id 值,则不确定哪一行将被 returned。您可以将 source 添加到 ORDER BY 以使其具有确定性:

ORDER BY max_id DESC, source DESC

(我不清楚实际要求;上面的语句应该 return 与问题中的查询所 return 相同的值,以及一个鉴别器,它告诉table id 值来自哪个。)

参考:https://dev.mysql.com/doc/refman/5.5/en/union.html


注意:这可能会满足您的用例,但在更一般的情况下,我们建议避免这种获取 id 的方法最后插入的行的值。

对于自动分配值的 auto_increment 列的值,last_insert_id 函数将 return 前一个插入的第一行的 id 值INSERT 语句在同一会话中。在多用户系统中,假设 "highest" id 值是由当前会话插入的行是 not 安全的 - 这种方法实际上被破坏了。