Выбор случайных данных, когда данные не возвращаются в SQLite - PullRequest
0 голосов
/ 22 марта 2012

Я использую 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);

Пожалуйста, проведите меня через это.

Спасибо.

1 Ответ

2 голосов
/ 22 марта 2012

Если нет записи, соответствующей предложению 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 ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...