0

「多次元」と「mysql」が一緒に使用されているのを見たと思います。この簡単な例を見てみましょう。

20個のスレッドを選択したいとしましょう。必要なものを単純にします。id、author_id、subject、bodyが必要です。whereステートメントで削除されたスレッドを除外する必要があります。これらのスレッドのすべての投稿を選択したいと思います。post_id、author、body、filteroutなどを削除したい。

どの行がどのスレッドに属しているかを知る必要があります。これをmysqlから一度に選択する方法はありますか?または、両方の列数を同じにし、IsThread(投稿の場合はfalse)を配置し、各投稿にスレッド番号+ nullまたは空の文字列の件名を含める必要がありますか?パフォーマンスが低下する可能性がありますか?(ただし、収集するスレッドのリストを投げるときは、thread#が必要です)

このすべてのデータを取得するselectステートメントを維持するためのパフォーマンスを向上させる方法はありますか?または、2つのステートメントが必要ですか?

-編集-コメントは私がこれを言いたくなりました。List<Tuple<int, int, string, string, List<Tuple<int, int, int, string>> >>mysqlから取得できますか。ええ、それはあなたの脳を傷つける可能性がありますが、私は通常2つのクエリで取得する投稿とスレッドのデータが必要ですが、1つで

4

2 に答える 2

2

何かが欠けていない限り、これは典型的な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";
}

(私はこれをカフから外しただけであることを心に留めておいてください。そのため、事前に構文エラーや文法の誤りをお詫びします。)

于 2012-12-28T06:22:20.997 に答える
1

スレッドには投稿に関する多くの関係があると思います。その場合、使用できますgroup_concat

例えば:

CREATE TABLE services (
id INT UNSIGNED NOT NULL, 
client_id INT UNSIGNED NOT NULL, 
KEY (id));
INSERT INTO services 
VALUES (1,1),(1,2),(3,5),(3,6),(3,7);

SELECT id,client_id FROM services WHERE id = 3;
+----+-----------+
| id | client_id |
+----+-----------+
|  3 |         5 | 
|  3 |         6 | 
|  3 |         7 | 
+----+-----------+

SELECT id,GROUP_CONCAT(client_id) FROM services WHERE id = 3 GROUP BY id;     
+----+-------------------------+
| id | GROUP_CONCAT(client_id) |
+----+-------------------------+
|  3 | 5,6,7                   | 
+----+-------------------------+
于 2012-12-28T06:23:52.037 に答える