【问题标题】:PDO / SQLite: Single query covering two related databasesPDO / SQLite:覆盖两个相关数据库的单个查询
【发布时间】:2012-10-04 21:17:36
【问题描述】:

上下文

使用 Feeddemon 的两个 SQLite 数据库 tags.fdbfeeds.fdb,我创建了这个有效的原始查询(使用 Firefox 的便捷插件 SQLite Manager 进行了测试):

SELECT tbl_tags.tag_name, feeds.tbl_posts.link
FROM tbl_tags
INNER JOIN feeds.tbl_posts
ON tbl_tags.fd_postid=feeds.tbl_posts.fd_postid
ORDER BY tbl_tags.tag_name

它主要查询 Feeddemon 的 tags.fdb 和附加的 feeds.fdb 数据库文件(使用 SQLite 的功能 ATTACH feeds.fdb AS feeds)。它列出了所有带标签的帖子及其标签名称和超链接。可以看到,数据库内容是通过fd_postid关联的。

可视化发生情况的示例:

tags.fdb的 tbl_tags 表内容:

fd_postid tag_name
1         rainbow
2         orange
5         green

feeds.fdb 的 tbl_posts 表内容:

fd_postid link
1         google.com
2         stackoverflow.com
3         microsoft.com
4         slashdot.org
5         techcrunch.com

查询结果,按tag_name排序:

green    techcrunch.com    
orange   stackoverflow.com
rainbow  google.com

问题

如何使用 PHP 中的 PDO 实现这个单一的内连接查询以覆盖多个相关数据库?

在 PDO 中连接两个数据库也会创建两个对象:

$db1 = new PDO('sqlite:tags.fdb');
$db2 = new PDO('sqlite:feeds.fdb');

但如果我想查询,我必须指定一个对象:

$result = $db1->query('SELECT * FROM sometable');

那么我如何弥合差距并使用一个查询来定位两个数据库?

或者我可以直接在 PDO 中使用 SQLite 的 ATTACH database AS alias 功能吗?如果是这样,怎么做?但这可能会被认为是不好的做法,对吧?由于 PDO 旨在成为非特定数据库。

我认为该用户最终也在寻找相同的东西,但从未真正了解工作代码示例:

How do you join two PDO objects in the same foreach loop?

注意:在回答时请考虑到我是一个前端/图形专家,从大约两个月前开始学习 PHP/PDO/SQLite。这个问题可能超出了我的经验水平。我很惊讶我设法让原始查询正常工作。但我正在学习...

【问题讨论】:

    标签: php sqlite pdo


    【解决方案1】:

    要在 SQLite 中通过一个查询访问多个数据库,您必须 ATTACH 它们。

    使用 PDO,它的工作方式与执行任何其他 SQL 命令的方式相同;您只需指定不同的文件名(和目录,如果需要):

    $db = new PDO('sqlite:tags.db');
    $db->exec('ATTACH \'feeds.db\' as feeds');
    $result = $db->query('SELECT tbl_tags.tag_name, feeds.tbl_posts.link ...');
    

    虽然 PDO 旨在大部分独立于实际数据库,但您在打开数据库时无法避免指定 sqlite:,并且您可以使用的实际 SQL 方言始终取决于数据库。出于实际目的,ATTACH 命令在逻辑上是打开数据库的一部分,feeds.tbl_posts 只是一个表名。

    注意:SQLite 在所有附加数据库中搜索表名,因此您可以省略数据库名以获得唯一的表名。

    【讨论】:

    • 就是这样!太感谢了!我之前已经尝试过,但没有在 ATTACH 命令中转义 '。修复后我发现了一些奇怪的东西(对我来说):它似乎在我的网络服务器的根安装目录中寻找 feeds.fdb,而不是我执行 php 脚本的同一目录(就像它对 tags.fdb 所做的那样) .只是为了测试您的解决方案,我通过暂时将 feeds.fdb 移动到安装目录来解决它......但这似乎是一个非常糟糕的解决方案。我会继续寻找它为什么会这样。但是非常感谢你解决了我的问题!
    • 这个方法给我错误Could not find driver ... PDO->__construct('sqlite:...
    猜你喜欢
    • 1970-01-01
    • 2014-08-15
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多