mysql'WHERE'条件中的列号

Posted

技术标签:

【中文标题】mysql\'WHERE\'条件中的列号【英文标题】:Column number in mysql 'WHERE' conditionmysql'WHERE'条件中的列号 【发布时间】:2021-10-13 22:27:34 【问题描述】:

如何选择Where clause 中的第一列。我正在尝试创建一个php 函数来根据id 检索表数据,但是由于id 列的标题在各个表中不同,我需要将Where 子句中的第一列称为第一列始终是 id 列。

该场景将类似于以下内容,但它会引发错误并指出 SQL 语法中存在错误。

$stmt = $this->conn->prepare("SELECT * FROM $table WHERE column(1) = :id");

提前致谢。

【问题讨论】:

AFAIK,mysql 没有任何这样的功能。像这样依赖列的顺序似乎不太可靠。 只有在GROUP BYORDER BY 中才能按编号引用列。 不是一个好主意。但是,如果您真的想这样做,可以通过information_schema.columns.ordinal_position 动态生成该查询。 谢谢亲爱的@Barmar。有什么策略可以绕过这个问题? 相关:***.com/q/52559333/2943403(未答复的重复) 【参考方案1】:

我认为没有内置的方法可以做到这一点。但是您可以查询INFORMATION_SCHEMA.COLUMNS 来获取列名。

$col_stmt = $this->conn->prepare("
    SELECT column_name 
    FROM information_schema.columns 
    WHERE table_schema = DATABASE() 
        AND ordinal_position = 1 
        AND table_name = :table");
$col_stmt->execute([':table' => $table]);
$first_col = $col_stmt->fetchColumn();
$stmt = $this->conn->prepare("SELECT * FROM `$table` WHERE `$first_col` = :id");

【讨论】:

单程访问数据库怎么样? 你可以在存储过程中做同样的事情。想不出任何其他方法可以通过一次前往 DB 来完成。【参考方案2】:

由于没有内置的方法来执行此操作,我想出了以下代码块来获取第一列,然后在我的 SELECT 语句中使用它。

$stmt = $this->conn->query("SHOW columns FROM $table");
        return $stmt->fetch(PDO::FETCH_LAZY)[0];

我认为这个策略比Barmar 的策略要短一些,尽管他是完全正确的。

【讨论】:

以上是关于mysql'WHERE'条件中的列号的主要内容,如果未能解决你的问题,请参考以下文章

根据熊猫中的条件删除重复的列

有条件地选择 postgresQL 中的列

如何有条件地隐藏或显示剑道网格​​中的列

根据另一个表中的条件显示表中的列

使用pyspark中的条件创建具有运行总量的列

如何有条件地隐藏 ag 网格中的列