【发布时间】: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 是指向接口切片的指针,原因有两个:
-
据我所知,
Columns和sql.Rows的名称中没有限定词,所以我基本上得到了两个Columns,它们的名称只是active,没有table1或table2。这意味着,table2.active在扫描到目标结构时会覆盖table1.active。 -
我们还假设
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 谢谢!如果您发布答案,我很乐意接受! -
随意回答(然后接受)您自己的问题 ;-)