何かが欠けていない限り、これは典型的なJOIN queryのように聞こえます。
次のような 2 つのテーブルがあるとします。
CREATE TABLE Threads (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
originalAuthorId INTEGER,
subject VARCHAR(100),
created DATETIME,
deleted INTEGER );
CREATE TABLE Posts (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
threadId INTEGER,
authorId INTEGER,
body TEXT,
created DATETIME,
deleted INTEGER,
FOREIGN KEY (threadId) REFERENCES Threads (id)
ON DELETE CASCADE
ON UPDATE CASCADE );
一度にすべてを選択するクエリは、次のようになります。
SELECT
t.id AS "threadId",
t.originalAuthorId,
t.subject AS "threadSubject",
t.created AS "threadCreated",
p.id AS "postId",
p.authorId,
p.body,
p.created AS "postCreated"
FROM
Threads t JOIN Posts p
ON t.id = p.threadId
WHERE
t.deleted = 0 AND
p.deleted = 0;
このクエリは、threadId、originalAuthorId、threadSubject、threadCreated、postId、authorId、body、および postCreated の 8 つの列を持つテーブルを生成します。
それがあなたが探しているものでない場合は、コメントをドロップするか、元の質問を更新してください。さらにお手伝いします.
編集:
以下のコメントに従って、大量のデータのクエリを最適化する方法を次に示します。サンプル スクリプト言語として PHP を使用します。
// Set $dbh to a PDO object pointing to your database.
$sql = "SELECT id, originalAuthorId, subject, created FROM Threads ".
"WHERE deleted = 0";
$sth = $dbh->query($sql);
$threads = array( );
while ($row = $sth->fetch(PDO::FETCH_ASSOC))
$threads[$row['id']] = $row;
$sql = "SELECT id, threadId, authorId, body, created FROM Posts ".
"WHERE deleted = 0 ORDER BY threadId";
$sth = $dbh->query($sql);
while ($row = $sth->fetch(PDO::FETCH_ASSOC))
$posts[$row['id']] = $row;
// At this point, you can view your post information, sort it using whatever
// sort mechanism you want, etc. You can get access to the thread information
// in the thread array. For example:
foreach ($posts as $k => $v)
echo "Post ".$k." created at ".$v['created']." belongs to thread ".
$v['threadId']." by author id ".
$threads[$v['threadId']]['originalAuthorId']. " created ".
$threads[$v['threadId']]['created']."\n";
非常に大量のデータがある場合は、2 つのステートメント ハンドルを同時にデータベースに対して実際に開き、巧妙な順序付けによってそれらを同時に反復処理することで、非常に凝った処理を行うことができます。もう少し複雑な例を次に示します。
// Set $dbh to a PDO object pointing to your database.
$sql = "SELECT id, originalAuthorId, subject, created FROM Threads ".
"WHERE deleted = 0 ORDER BY id";
$sthThreads = $dbh->query($sql);
$sql = "SELECT id, threadId, authorId, body, created FROM Posts ".
"WHERE deleted = 0 ORDER BY threadId";
$sthPosts = $dbh->query($sql);
$rowThread = null;
while ($rowPost = $sthPosts->fetch(PDO::FETCH_ASSOC)) {
// You REALLY want a foreign key constraint for the following statement!
while ($rowThread === null || $rowThread['id'] !== $rowPost['threadId'])
$rowThread = $sthThreads->fetch(PDO::FETCH_ASSOC);
echo "Post ".$rowPost['id']." created at ".$rowPost['created'].
" belongs to thread ".
$rowPost['threadId']." by author id ".
$rowThread['originalAuthorId']. " created ".
$rowThread['created']."\n";
}
(私はこれをカフから外しただけであることを心に留めておいてください。そのため、事前に構文エラーや文法の誤りをお詫びします。)