【问题标题】:Unable to create a temporary table from a select query with multiple joins. Throws 'Duplicate column name 'id'无法从具有多个连接的选择查询创建临时表。抛出'重复的列名'id'
【发布时间】:2020-08-07 09:00:42
【问题描述】:

这是导致问题的查询:

CREATE TEMPORARY TABLE fetchedCropVariety ENGINE = MEMORY 
SELECT *
     , hz.zoneName
     , i.fullImageUrl
     , i.previewImageUrl
     , u.userName
  FROM seedrecord s
  LEFT 
  JOIN HardinessZone hz 
    ON hz.id = s.hardiness_zone_id
  JOIN image i 
    ON s.id = i.seedrecord_id 
  JOIN members u 
    ON s.FK_USER = u.id 
WHERE s.id = 1 
   AND s.deleted = FALSE;

当我执行这个查询时,它会抛出错误Error Code: 1060. Duplicate column name 'id' seedrecord 表中没有名为 id 的重复列,因此这是由其他表中的一个或多个 id 列引起的,这些列仅用于连接它们以检索 zoneNamefullImageUrl

当我从查询中删除 *, 时,查询会运行,但 seedrecord 中的所有字段都将被省略。它一定是来自seedrecordid 列与来自hardinessZonemembers 的id 列以某种方式发生冲突,但我不想将这两个表的id 字段包含到我要创建的临时表中所以这个错误真的让我很困惑。

谁能告诉我我能做些什么来阻止这个错误的发生?

谢谢

【问题讨论】:

  • 永远不要使用SELECT *

标签: mysql select left-join inner-join


【解决方案1】:

别做

select *

它将占用您在 From 子句中拥有的所有 clomuns

你有至少两个列是namend id

改为制作

S.*,u.*

等等

【讨论】:

  • 您是说 * 会从所有表(seedrecord、hardinesszone、成员)中获取所有列,因为这可以解释重复列错误。如果是这种情况,您能否向我解释为什么它还要从连接表中选择所有内容?我的意思是在FROM 之后我没有 HardinessZone 或 Image 等,就像 SeedRecord 一样。
  • 因为这是 select * 使其选择所有可用列的原因,也是 join 使其将来自两个 tbales 的所有列与加入它们的条件相连接的原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
相关资源
最近更新 更多