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 安全的 - 这种方法实际上被破坏了。
$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 安全的 - 这种方法实际上被破坏了。