PHP 带有 IN 子句和 LIMIT 的 PDO
PHP PDO with IN clause and LIMIT
我正在尝试使用 PDO 和 LIMIT 执行带有 IN 子句的语句。
学习本教程后https://phpdelusions.net/pdo#in我已经成功构建了可以运行的代码,但没有按应有的方式检索数据
$inStmt = DB::prepare("SELECT following_user_id FROM following WHERE user_id=?");
$inStmt->execute([$userId]);
$arr = ($inStmt->fetchAll(PDO::FETCH_NUM));
$array = array();
foreach ($arr as $element ) {
$array = array_merge($array, $element);
}
$in = str_repeat('?,', count($array)) . '?';
$params = array_merge($array,[$userId]);
$sql = "SELECT * FROM user_tweets WHERE user_id IN ($in) ORDER BY tweet_date DESC LIMIT 20 OFFSET ?";
$stmt = DB::prepare($sql);
for ($x = 0; $x <= count($params) - 1; $x++) {
$param = $params[$x];
echo " ID:" .($x+1) . " PARAM:". $param;
$stmt->bindParam(($x+1),$param);
}
$param = (int)$startFrom;
echo " ID:" .(count($params)+1) . " PARAM:". $param;
$stmt->bindParam((count($params)+1),$param,PDO::PARAM_INT);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
例如第一个语句 returns 数组 [43,42]
。然后我将它与 53 合并,所以我得到 [43,42,53]
这些是这个例子的回声
ID:1 PARAM:42 ID:2 PARAM:41 ID:3 PARAM:53 ID:4 PARAM:0
查询也按应有的方式创建:
SELECT * FROM user_tweets WHERE user_id IN (?,?,?) ORDER BY tweet_date DESC LIMIT 20 OFFSET ?
我的代码有什么问题?我很困惑,因为一切都应该没问题(当我用已经设置的变量调用我的数据库时,它会 return 几行所以它也应该与 PDO 一起工作,但 return 什么都没有)
SELECT * FROM user_tweets WHERE user_id IN (42,41,53) ORDER BY tweet_date DESC LIMIT 20 OFFSET 0
这似乎是做同样事情的一种更简单(并且无限快)的方法:
SELECT t.*
FROM following f
JOIN user_tweets t
ON t.user_id = f.following_user_id
WHERE f.user_id=?
ORDER
BY t.tweet_date DESC
我正在尝试使用 PDO 和 LIMIT 执行带有 IN 子句的语句。
学习本教程后https://phpdelusions.net/pdo#in我已经成功构建了可以运行的代码,但没有按应有的方式检索数据
$inStmt = DB::prepare("SELECT following_user_id FROM following WHERE user_id=?");
$inStmt->execute([$userId]);
$arr = ($inStmt->fetchAll(PDO::FETCH_NUM));
$array = array();
foreach ($arr as $element ) {
$array = array_merge($array, $element);
}
$in = str_repeat('?,', count($array)) . '?';
$params = array_merge($array,[$userId]);
$sql = "SELECT * FROM user_tweets WHERE user_id IN ($in) ORDER BY tweet_date DESC LIMIT 20 OFFSET ?";
$stmt = DB::prepare($sql);
for ($x = 0; $x <= count($params) - 1; $x++) {
$param = $params[$x];
echo " ID:" .($x+1) . " PARAM:". $param;
$stmt->bindParam(($x+1),$param);
}
$param = (int)$startFrom;
echo " ID:" .(count($params)+1) . " PARAM:". $param;
$stmt->bindParam((count($params)+1),$param,PDO::PARAM_INT);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
例如第一个语句 returns 数组 [43,42]
。然后我将它与 53 合并,所以我得到 [43,42,53]
这些是这个例子的回声
ID:1 PARAM:42 ID:2 PARAM:41 ID:3 PARAM:53 ID:4 PARAM:0
查询也按应有的方式创建:
SELECT * FROM user_tweets WHERE user_id IN (?,?,?) ORDER BY tweet_date DESC LIMIT 20 OFFSET ?
我的代码有什么问题?我很困惑,因为一切都应该没问题(当我用已经设置的变量调用我的数据库时,它会 return 几行所以它也应该与 PDO 一起工作,但 return 什么都没有)
SELECT * FROM user_tweets WHERE user_id IN (42,41,53) ORDER BY tweet_date DESC LIMIT 20 OFFSET 0
这似乎是做同样事情的一种更简单(并且无限快)的方法:
SELECT t.*
FROM following f
JOIN user_tweets t
ON t.user_id = f.following_user_id
WHERE f.user_id=?
ORDER
BY t.tweet_date DESC