Union Select в PDO не работает - PullRequest
0 голосов
/ 16 марта 2012

Я новичок в использовании PDO для выполнения запросов к базе данных и мне нужна небольшая помощь. У меня есть следующий вызов БД:

$stmt1 = $pdo->prepare('
    SELECT * FROM news WHERE pub_date >= ? AND pub_date < ? AND display = 1 ORDER BY pub_date DESC
    UNION
    SELECT * FROM vs_news WHERE pub_date >= ? AND pub_date < ? AND display = 1 ORDER BY pub_date DESC
');
$stmt1->bindParam(1, $col_start);
$stmt1->bindParam(2, $col_end);
$stmt1->execute();

Я прочитал достаточно, чтобы думать, что UNION совместим с PDO, но я не могу правильно понять код и не могу найти пример в полном формате кода.

Поля в обеих таблицах одинаковы, и вызов db работает только с одной или другой таблицей, но не с UNIION, который я показал.

Может кто-нибудь указать, где моя проблема?

Спасибо

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

Использование? означает, что вы должны соответствовать параметру для каждого?

Используйте такой подход:

$stmt1 = $pdo->prepare('
    SELECT * FROM news WHERE pub_date >= :date1 AND pub_date < :date2 AND display = 1 ORDER BY pub_date DESC
    UNION
    SELECT * FROM vs_news WHERE pub_date >= :date1 AND pub_date < :date2 AND display = 1 ORDER BY pub_date DESC
');
$stmt1->bindParam(':date1', $col_start);
$stmt1->bindParam(':date2', $col_end);
$stmt1->execute();

Также; При использовании union убедитесь, что в обоих запросах используется ОДНОВРЕМЕННОЕ количество столбцов.

3 голосов
/ 16 марта 2012

Чтобы использовать ORDER BY внутри UNION, вы должны заключить компоненты в (). Сделайте это в дополнение к привязке всех четырех параметров, как предложено в комментариях, или используйте именованные заполнители, как предложено в другом месте:

$stmt1 = $pdo->prepare('
    (SELECT * FROM news WHERE pub_date >= ? AND pub_date < ? AND display = 1 ORDER BY pub_date DESC)
    UNION
    (SELECT * FROM vs_news WHERE pub_date >= ? AND pub_date < ? AND display = 1 ORDER BY pub_date DESC)
');

Это описано в синтаксической справке MySQL UNION.

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