簡體   English   中英

帶有IN子句和LIMIT的PHP 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);

例如,第一條語句返回[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 ?

我的代碼有什么問題? 我很困惑,因為一切都應該沒問題(當我使用如下已設置的變量調用數據庫時,它確實返回了幾行,因此它也應該與PDO一起工作,但什么也不返回)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM