【问题标题】:Selecting random data when no data is returned in SQLite在 SQLite 中没有返回数据时选择随机数据
【发布时间】:2012-06-25 23:52:48
【问题描述】:

我在我的一个应用程序中使用 SQLite 我有一个条件是我首先运行一个查询,如果它返回结果然后我检索它的数据但是如果第一个查询没有返回任何我想运行另一个查询只需从数据库中选择任意随机行并返回结果。

我设计了以下代码,如果它与第一种情况下的数据匹配,则它可以正常工作,但不适用于第二种情况。

$sql_query = "SELECT (select count(*)) as count,* FROM item WHERE combo LIKE '%" . $ans_combo . "%' LIMIT 1;";
        $sql_query_bu = "SELECT * FROM item ORDER BY RANDOM() LIMIT 1;";
        ini_set('display_errors', true);
        error_reporting(E_ALL);

        try {
            $dbh = new PDO("sqlite:src/appdb.s3db");
            $dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $dbh -> setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
            $stmt = $dbh -> prepare($sql_query);
            $stmt -> execute();
            foreach ($stmt as $row) {
                if ($row['count'] != '1') {
                    echo $sql_query_bu . "<br/>";
                    $stmt = $dbh -> prepare($sql_query_bu);
                    $stmt -> execute();
                    foreach ($stmt as $row) {
                        echo $row['name'], " ", $row['name'], " ", $row['name'], "\n";
                    }
                }
                echo "Count: " . $row['count'];
                echo $row['name'], " ", $row['name'], " ", $row['name'], "\n";
            }
        } catch(Exception $ex) {
            var_dump($ex);
        }

        unset($dbh);
        unset($stmt);

请指导我完成此操作。

谢谢。

【问题讨论】:

    标签: php sql sqlite


    【解决方案1】:

    如果没有与 WHERE 子句匹配的记录,第一次调用 fetch() 将返回 FALSE。在这种情况下,您可以简单地发送 ORDER BY RANDOM()* 查询并获取第一条记录。

    独立示例:

    <?php
    $pdo = new PDO('sqlite::memory:');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    setup($pdo);
    
    
    $stmt = $pdo->prepare('SELECT * FROM soFoo WHERE combo=? LIMIT 1');
    $stmt->execute( array('comboF') ) ;
    $row = $stmt->fetch();
    $stmt = null;
    
    if ( !$row ) {
        $row = $pdo->query('SELECT * FROM soFoo ORDER BY RANDOM() LIMIT 1')->fetch();
    }
    var_dump($row);
    
    
    
    function setup($pdo) {
        $pdo->exec('
            CREATE TABLE soFoo (
                combo TEXT,
                x TEXT
            )
        ');
    
        $stmt = $pdo->prepare('INSERT INTO soFoo (combo,x) VALUES (?,?)');
        $stmt->execute( array('comboA','A') );
        $stmt->execute( array('comboB','B') );
        $stmt->execute( array('comboC','C') );
        $stmt->execute( array('comboD','D') );
    }
    

    (*) ORDER BY RANDOM() 是例如在 MySQL 中相当昂贵。我怀疑 SQLite 对于这种情况有一个特殊的例程。更好地为 ORDER BY RANDOM() 寻找一个好的替代方案

    【讨论】:

    • 暂时工作,thnx 的建议我肯定会寻找一些更好的选择。谢谢你。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    相关资源
    最近更新 更多