【问题标题】:PDO: Using a substring as criteria to get a row count [duplicate]PDO:使用子字符串作为标准来获取行数[重复]
【发布时间】:2020-03-15 10:36:07
【问题描述】:

我可以使用以下代码从字段连接中提取正确的状态:“城市,州 - 名称县 - 邮政编码”:

$sql="SELECT trim(substring(SUBSTRING_INDEX(county_city,',',-1),1,3)) as state
          FROM
            " . $this->table_name . "
          WHERE
            admid = 45";

如果我使用以下代码尝试获取行数,最终会找到 0 行:

$sql="SELECT trim(substring(SUBSTRING_INDEX(county_city,',',-1),1,3)) as state,
            COUNT(*) as total_rows
          FROM
            " . $this->table_name . "
          WHERE
            DATE_FORMAT(refer_date,'%m') = ?
          AND
            DATE_FORMAT(refer_date, '%Y') = ?
          AND
            unit = ?
          AND
            state = ?";

            // prepare query statement
            $stmt = $this->conn->prepare( $sql );

            // bind variable values
            $stmt->bindParam(1, $refer_month);
            $stmt->bindParam(2, $refer_year);
            $stmt->bindParam(3, $unit);
            $stmt->bindParam(4, $state);

            $stmt->execute();
            $row = $stmt->fetch(PDO::FETCH_ASSOC);

            return $row['total_rows'];

知道为什么吗?

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    https://dev.mysql.com/doc/refman/8.0/en/problems-with-alias.html

    标准 SQL 不允许您在 WHERE 子句中引用列别名。施加此限制是因为在执行 WHERE 代码时,可能尚未确定列值。

    你需要做的:

    $sql="SELECT trim(substring(SUBSTRING_INDEX(county_city,',',-1),1,3)) as state,
            COUNT(*) as total_rows
          FROM
            " . $this->table_name . "
          WHERE
            DATE_FORMAT(refer_date,'%m') = ?
          AND
            DATE_FORMAT(refer_date, '%Y') = ?
          AND
            unit = ?
          AND
            trim(substring(SUBSTRING_INDEX(county_city,',',-1),1,3)) = ?";
    

    或者,或者类似:

    "SELECT * FROM (SELECT trim(substring(SUBSTRING_INDEX(county_city,',',-1),1,3)) as state,
            COUNT(*) as total_rows
          FROM
            " . $this->table_name . "
          WHERE
            DATE_FORMAT(refer_date,'%m') = ?
          AND
            DATE_FORMAT(refer_date, '%Y') = ?
          AND
            unit = ?
       ) as q1 WHERE q1.state = ?";
    

    我的子选择语法可能有点偏离,但你明白了。

    【讨论】:

    • 太棒了!感谢您及时的回复!有时我对一个问题看得太远而错过了一些更简单的东西。我确实想知道是否是因为未确定列值。我用了你的第一个例子。只是因为我已经在 SELECT 中编写了它。 (懒我!)
    猜你喜欢
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 2022-08-19
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    相关资源
    最近更新 更多