【发布时间】: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 是聚合函数