当列不明确时,有啥方法可以强制 Mysql 在 where 子句中使用 select 中的列?

Posted

技术标签:

【中文标题】当列不明确时,有啥方法可以强制 Mysql 在 where 子句中使用 select 中的列?【英文标题】:Any way to force Mysql to use column from select in where clause when column is ambiguous?当列不明确时,有什么方法可以强制 Mysql 在 where 子句中使用 select 中的列? 【发布时间】:2017-07-22 01:31:19 【问题描述】:

我有疑问:

select products.* from products
join companies on companies.id = products.company_id
where id = 1;

查询生成错误“where 子句中的列 'id' 不明确”。我知道该列不明确,但我想告诉 mysql 只查看选择“products.”中的列。因此,如果我有 "products." 来自产品的 id 将在 where 子句中检查,如果我有 "companies." 来自公司的 id 将在 where 子句中检查,如果我有 "products. em>, Companies.*" 只有这样 id 才会有歧义。

这只是一个简单的例子,查询更复杂,由 ORM 生成。我知道我可以使用

select products.id as products_id from products

然后使用

where products_id  = 1

或者我可以使用

where products.id = 1;

但这不符合我的需要,因为查询是由 orm 生成的。有什么想法吗?

【问题讨论】:

你试过WHERE products.id = 1了吗? 这是一个不好的例子。但是 - 您可以使用子查询。 @PaulSpiegel 出现这个问题是因为我将子查询更改为加入查询,因为它们慢了 1000 倍... 子查询是一个通用的解决方案。如果你想要一个具体的解决方案,你的例子应该更具体。 我不明白的是:在某些时候,您必须决定在 SELECT 中使用哪个表。所以你有一个像->select("$tableName.*")这样的代码。为什么不能对 WHERE 子句使用相同的变量:->where("$tableName.id", 1) 【参考方案1】:

您可以在编写时指定要从哪个表中使用 id:

WHERE products.id = 1

使用 eloquent 时,您可以使用 DB::raw:

DB::table('products')
    ->select(DB::raw('products.*'))
    ->join('companies', DB::raw('companies.id'), '=', DB::raw('products.company_id'))
    ->where(DB::raw('products.id'), '=', 1)
    ->get()
;

【讨论】:

与其他答案相同:WHERE 子句中的表名是硬编码的,这不是 OP 想要的。 没有任何信息表明他不能/不想对表进行硬编码。只有一个信息,他正在使用雄辩。在我的回答和你的反对之后,他在评论中写了这个。 答案没有错。即使不是他想要的,它也能正常工作——如果他不写,就无法预测他想要什么。【参考方案2】:
select products.* from products
join companies on companies.id = products.company_id
where products.id = 1;

【讨论】:

请阅读问题。 OP 不想在 where 子句中硬编码表前缀。 @PaulSpiegel 不是他写的。他只是写了他不知道如何使用 eloquent 来做到这一点。

以上是关于当列不明确时,有啥方法可以强制 Mysql 在 where 子句中使用 select 中的列?的主要内容,如果未能解决你的问题,请参考以下文章

where 子句中的列不明确 - 这是啥意思?

当列值是 84 字节文本字段时,postgres 中保持列唯一的最有效方法是啥?

MySQL查询时强制区分大小写的方法

当列的值相等时在同一个 MySQL 表上更新行

有啥方法可以强制在 iOS13 的入职过程中出现“始终允许”提示?

当列不是 PK 时,EF6 MySQL StrongTypingException