【问题标题】:Scan items from a query with multiple columns of the same name扫描具有多个同名列的查询中的项目
【发布时间】:2021-06-03 07:24:14
【问题描述】:

我有一个类似的查询

myQuery := "SELECT DISTINCT table1.id, table1.active, table2.active FROM table1 INNER JOIN table 2 ON table1.id = table2.foreign_id AND table2.active = true

我正在使用 MySQL

我必须选择table2.active 以避免SELECT list; this is incompatible with DISTINCT in my sql 错误。

我正在使用sqlx,但我认为问题更深层次。我无法使用err := conn.Unsafe().Select(dest, myQuery) 将结果扫描到目标对象中,而interface{} 类型的dest 是指向接口切片的指针,原因有两个:

  1. 据我所知,Columnssql.Rows 的名称中没有限定词,所以我基本上得到了两个 Columns,它们的名称只是 active,没有 table1table2。这意味着,table2.active 在扫描到目标结构时会覆盖 table1.active

  2. 我们还假设table1.active 具有除table2.active 之外的另一种类型(这在这个简单的示例中没有多大意义,但在我的实际场景中确实如此)。我会收到一个错误,因为 table2.active 值的类型错误,无法扫描到我的目标对象中。

由于我不知道dest 中结构的性质,因此直接检查Rows 并没有多大帮助,因为手动将这些值写入dest 结构是不可能的。我可以通过一些反射获取目标结构的所有字段名称,并将它们放入查询的SELECT 部分(这就是我实际上正在做的事情),但实际上并非如此。

我还想知道是否可以在子查询之上进行查询,将其包装到外部查询中,而不会出现所有误导性列。但是像SELECT id, active FROM table1 WHERE id IN ([query above]) 这样的查询也不适用于所有其他返回的列。 也许我可以手动收集 id 并运行第二个查询,但这可能相当无效。

【问题讨论】:

  • 为什么不能只使用别名? table2.active as active2 FROM table1...
  • @Strawberry 由于 MySQL 的限制 (SELECT list; this is incompatible with DISTINCT in my sql error),我预计 SELECT 部分中的名称必须与 JOIN 条件中的名称匹配。但是在第一次简短的测试之后,情况似乎并非如此。天哪……那太容易了! :D 谢谢!如果您发布答案,我很乐意接受!
  • 随意回答(然后接受)您自己的问题 ;-)

标签: mysql go sqlx


【解决方案1】:

Strawberry 刚刚在 cmets 中给出了解决方案:即使 SELECT 子句中为防止出现 SELECT list; this is incompatible with DISTINCT in my sql error 错误而需要的列也可以使用别名。所以基本上

SELECT DISTINCT table1.id, table1.active, table2.active as active2 FROM table1 INNER JOIN table 2 ON table1.id = table2.foreign_id AND table2.active = true

成功了 - MySQL 错误将消失,但该列不会妨碍扫描仪!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-21
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多