php - PDO/SQLite : Single query covering two related databases

标签 php sqlite pdo

上下文

使用 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。这个问题可能超出了我的经验水平。我很惊讶我设法让原始查询正常工作。但是我正在学习...

最佳答案

要通过 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 在所有附加的数据库中搜索表名,因此您可以省略唯一表名的数据库名称。

关于php - PDO/SQLite : Single query covering two related databases,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12886480/

相关文章:

php - 如果数据表中的计数值为空,则隐藏空 td

php - 如何在php中的其他字符之间设置一个字符

Javascript 选择开关选择更改

php - WooCommerce - 在开始/结束日期之间的列表中获取事件订阅

Python sqlite3 : force to bind a parameter as string?

php - PDO 和 SQL 创建临时表的一般错误

php - 检查图像修改时间的 HTACCESS 图像缓存规则

c# - 如何安装 SQLite 以在面向 UAP v10 的通用 Windows 应用程序中使用

java - 将多个表导出到多个 CSV 文件

php - PDO fetchAll 不返回所有行