UNION mysql确定结果来自哪个表

时间:2015-04-25 05:05:13

标签: php mysql pdo

$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具有某个属性。此属性取决于表,这就是我想要获取表的原因。

2 个答案:

答案 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,并插入时间,然后根据插入的时间进行区分