MySQL SELECT、LEFT JOIN和COUNT()在一个查询中返回错误


MySQL SELECT, LEFT JOIN and COUNT() in one query returns error

我遇到了相当简单的查询!

简单地说,我已经创建了一个搜索(过滤器)面板,现在我正在添加分页

我在返回当前查询中的行数时遇到问题,这主要取决于动态更改的$detailed_search_query变量。

我需要进行以下操作,并将COUNT()正确添加到其中,这样新行总数将包含unique_id的总数。

当前SQL:

$sql = $db->prepare( "
              SELECT
                individuals.individual_id,
                individuals.unique_id,
                individuals.fullname,
                individuals.day_of_birth,
                TIMESTAMPDIFF(YEAR,individuals.day_of_birth,CURDATE()) AS age,
                individuals.gender,
                individuals.record_timestamp,
                individuals.active,
                individuals.deleted,
                individuals_dynamics.weight,
                individuals_dynamics.degree,
                individuals_dynamics.trainer_name
              FROM
                individuals as individuals
              LEFT JOIN
                individuals_dynamics AS individuals_dynamics ON individuals.unique_id = individuals_dynamics.individual_id
              WHERE
                $detailed_search_query $display recognized = 'yes' 
              GROUP BY
                individuals.record_timestamp
              ORDER BY $by $how
              LIMIT " . $limit);

如果我将COUNT()添加到它,则PDO错误为Fatal error: Call to a member function execute() on a non-object

这就是我的新查询(刚刚开始,其余的都一样)的样子,它返回上面的错误:

$sql = $db->prepare( "
                  SELECT
                    COUNT(individuals.unique_id),
                    individuals.individual_id,
                    individuals.unique_id,
                    individuals.fullname,
                    individuals.day_of_birth,

我在这里错过了什么?

第1版:

我如何使用COUNT()的例子导致了简单的预查询:

 $sql              = $db->prepare("SELECT count(unique_id) FROM individuals");
 $sql->execute();
 $total            = $sql->fetchColumn();
 $pagination       = new Pagination($paginate_number);
 $limit            = $pagination->getLimit($total);

第2版:

是的,对,当我添加别名时,会返回相同的错误,例如:

$sql = $db->prepare( "
                  SELECT
                    COUNT(individuals.unique_id) as total,
                    individuals.individual_id,

第3版:

我对上一次EDIT很不满意,如果你添加别名,比如total,那么查询可以工作,但它只计算当前行并返回1,但我需要总行计数,例如:

Array
(
    [0] => Array
        (
            [total] => 1
            [0] => 1
            [individual_id] => 51
            [1] => 51
            [unique_id] => f598edae
            [2] => f598edae

第4版:

当PHP变量被替换时,我在WHERE子句中有这样的内容:

                  WHERE
                    individuals.fullname LIKE '%adam%' AND individuals_dynamics.degree BETWEEN '1' AND '3' AND EXTRACT(YEAR FROM (FROM_DAYS(DATEDIFF(NOW(),individuals.day_of_birth))))+0 BETWEEN '7' AND '10' AND individuals_dynamics.weight BETWEEN  '20' AND '40' AND individuals_dynamics.degree BETWEEN '7' AND '10' AND deleted != 'yes' AND active != 'no' AND recognized = 'yes' 
                  GROUP BY
                    individuals.record_timestamp

第5版:

所需的结果是在最终数组中具有密钥总数,该总数表示当前查询中基于动态PHP变量提取的结果总数,如$detailed_search_query$display:

现在我总有1个。何时应为75:

Array
(
    [0] => Array
        (
            [total] => 1
            [0] => 1
            [individual_id] => 71
            [1] => 71
            [unique_id] => f598e2ae
            [2] => f598e2ae
            [fullname] => Name2 Name2 Name2
        )
    [1] => Array
        (
            [total] => 1
            [0] => 1
            [individual_id] => 65
            [1] => 65
            [unique_id] => b76497ca
            [2] => b76497ca
        )

您得到的错误意味着PDO无法准备查询,原因是您的SQL查询中存在错误,数据库服务器无法执行它。。。因此,为了更好地理解这个问题,您应该发布尝试直接在mysql客户端上执行查询时出现的错误。

为了获得所需的结果集,可以插入一个子查询,该子查询统计与外部查询具有相同individual_id的记录。

查询的第一部分之后:

SELECT 
(SELECT COUNT(unique_id) FROM individuals i2 WHERE i2.individual_id = individuals. individual_id) AS total,
individuals.individual_id,
individuals.unique_id,
individuals.fullname,
individuals.day_of_birth,

请记住,要从子查询中正确引用外部查询的列,您应该使用两个不同的别名,即使您在两个查询(外部和子查询)中都是从同一个表中选择的。