【问题标题】:MariaDB: Can I retrive duplicate column names without using 'AS'MariaDB:我可以在不使用“AS”的情况下检索重复的列名吗
【发布时间】:2016-04-22 08:59:19
【问题描述】:

我有很多表使用id 作为主键。当我将几个表连接在一起并select * 时,只显示一个 id 列。使用 MySql 时,我可以解决此问题的唯一方法是使用 SELECT AS,例如 SELECT id AS groupId

MariaDB 仍然是这种情况吗?我的重复列名不仅限于 id 字段,因此我最终得到了非常冗长的 select 语句。

我希望 MariaDB 可能会引入一个查询功能,该功能允许列名以其表名开头。例如,查询可能会返回列名称group.idperson.id

编辑:根据 Shadow 的 cmets,问题不在于 MariaDB(或 MySql)。结果集确实包含多个“id”字段。问题出在客户端库上,在我的例子中是 PDO。

【问题讨论】:

  • 请注意,部分问题在于您不应该使用SELECT *,这是一种反模式。仅选择您实际需要的列有时可以让优化器计划更有效的查询,特别是在覆盖索引可用时。它还减少了客户端中的网络流量和资源使用,无论您的代码是否引用它,它通常都会解包数据。听起来好像您试图以牺牲对阅读它们的其他人来说更清晰的查询为代价来节省打字。

标签: mysql sql mariadb


【解决方案1】:

如果结果集中有多个同名的列,那么即使 mysql 也会返回所有列,但它们在结果集中也将具有相同的名称,除非您使用字段别名。创建了一个 sqlfiddle 来证明它here。您的客户端库可能无法区分这两列。这是一个已知问题,例如 laravel。

mysql 和 mariadb 都允许在字段名前加上表名,但是表名不会作为字段名的一部分返回。但是,大多数客户端库都能够检索 mysql / mariadb 返回的结果集中列的元数据,其中包括未计算列的表名。参见例如mysqli_fetch_field_direct() 函数。

您可以使用从元数据中检索到的表名来确定哪个 id 列属于哪个表。

【讨论】:

  • 一个例外:当您使用语法FROM a JOIN b USING(blah) 时,JOIN 键不重复。
  • 也不例外。如果没有 2 列同名,则整个问题不适用。 2 列可能在 2 个表中具有相同的名称,即使它们未在连接条件中使用。
猜你喜欢
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多