4

コンテクスト

FeeddemonのSQLiteデータベースの2つである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で2つのデータベースに接続すると、次の2つのオブジェクトも作成されます。

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

ただし、クエリを実行する場合は、単一のオブジェクトを指定する必要があります。

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

では、ギャップを埋め、1つのクエリを使用して両方のデータベースをターゲットにするにはどうすればよいですか?

または、SQLiteのATTACH database AS alias機能をPDOで直接使用できますか?もしそうなら、どのように?しかし、これはおそらく悪い習慣と見なされるでしょう?PDOはデータベースを非特定にすることを目的としているためです。

このユーザーは最終的に同じことを探していたと思いますが、実際に動作するコードサンプルのポイントに到達することはありませんでした。

同じforeachループで2つのPDOオブジェクトをどのように結合しますか?

注:回答するときは、私がフロントエンド/グラフィックスの人であり、約2か月前からPHP / PDO/SQLiteを学び始めたという事実を考慮してください。質問はおそらく私の経験レベルを超えています。生のクエリを機能させることができたのには驚いています。しかし、私は学んでいます...

4

1 に答える 1

4

SQLite で 1 つのクエリから複数のデータベースにアクセスするには、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 は接続されているすべてのデータベースでテーブル名を検索するため、データベース名を省略して一意のテーブル名にすることができます。

于 2012-10-14T22:06:08.250 に答える