PDO中的Union Select无法正常工作

时间:2012-03-16 00:29:13

标签: php pdo

我是使用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 个答案:

答案 0 :(得分:4)

使用?意味着你需要为每个参数匹配一个参数?

使用这种方法:

$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,请确保在两个查询中使用相同的列数。

答案 1 :(得分:3)

要在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 syntax reference.

中对此进行了描述