【问题标题】:LIMIT and OFFSET in a query [duplicate]查询中的 LIMIT 和 OFFSET [重复]
【发布时间】:2021-05-17 17:28:55
【问题描述】:

我有一个如下查询,
我刚刚添加了最后一行 LIMIT ?, ? ,因为我正在尝试实现分页。

添加最后一行后,我收到错误 `Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 ''0'、'50'' 附近使用的正确语法

任何建议都会很有帮助。

谢谢!

    $offset = 0;
    $limit = 50;

    $get_products = "SELECT p.`product_id`, p.`product_name`
               GROUP_CONCAT(COALESCE(t2.`trait_name`,t1.`trait_name`)) name 
                       FROM `products` p 
                       JOIN 
                            `product_to_traits` pt1 
                         ON pt1.`product_id` = p.`product_id` 
                       JOIN 
                           `personality_traits` t1 
                         ON t1.`trait_id` = pt1.`trait_id` 
                       JOIN 
                           `product_to_traits` pt2 
                         ON pt2.`product_id` = pt1.`product_id` 
                       JOIN 
                           `personality_traits` t2 
                         ON t2.`trait_id` = pt2.`trait_id` 
                      WHERE 
                            t1.`trait_id` = ? 
                        AND t2.`trait_id` IN ($answers) 
                        AND `is_deleted` = 0
                   GROUP BY p.`product_id` HAVING COUNT(*) > 1 
                   ORDER BY COUNT(*) DESC
                      LIMIT ? OFFSET ?";

     $db = getConnection();
     $stmt = $db->prepare($get_products);
     $params = array_merge([$main_category], $answer, [$limit], [$offset]);
     $stmt->execute($params);

问题可能出在$params = array_merge([$main_category], $answer, [$limit], [$offset]);

因为使用变量的查询更简单:

  $get_products = "SELECT *
                     FROM 
                          `products`  
                    WHERE
                          `is_deleted` = '0'
                 ORDER BY RAND()
                    LIMIT :limit
                   OFFSET :offset";

            $db = getConnection();
            $stmt = $db->prepare($get_products);
            $stmt->bindValue('limit', (int)$limit, PDO::PARAM_INT);
            $stmt->bindValue('offset', (int)$offset, PDO::PARAM_INT);
            $stmt->execute();

一切正常
因此,不可能将限制和偏移量放入变量中不是问题(就像这里的一个帖子中所说的那样)

【问题讨论】:

  • 您正在使用聚合函数计数,它应该在 select 之后出现。例如 SELECT MIN(age) FROM users WHERE condition ORDER BY DESC LIMIT ?抵消 ? .这里 MIN 是聚合函数

标签: php mysql


【解决方案1】:

您要求order by count(*) 没有在您的select 中。

【讨论】:

    猜你喜欢
    • 2011-07-27
    • 2011-03-20
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2020-10-11
    • 1970-01-01
    相关资源
    最近更新 更多