0

私はMySQLを学んでいて、結合をいじっています。これらのクエリを削減して組み合わせることができるかどうか疑問に思っています。これは私が通常行うことです:

$stmt = $db_pdo->prepare('SELECT date, table2_id, comments 
                          FROM table1 
                          WHERE user = "victor"');
$stmt->execute();
foreach ($stmt as $row) {
  $table2_id = $row['table2_id'];
}

$stmt = $db_pdo->prepare('SELECT table3_id 
                          FROM table2 
                          WHERE table2_id = '.$table2_id.'');
$stmt->execute();
foreach ($stmt as $row) {
  $table3_id = $row['table3_id'];
}

$stmt = $db_pdo->prepare('SELECT previous_comments_count 
                          FROM table3 
                          WHERE table3_id = '.$table3_id.'');
$stmt->execute();
foreach ($stmt as $row) {
  $table3_id = $row['table3_id'];
}

(変数を変更したので、わざとばかげているように見えます。この会社のテーブルは私が設計したものではありません)

基本的に、最初のテーブルからほとんどの情報を取得する必要がありますが、最初のクエリに入れたい 2 つのテーブルをまたぐ必要がある "id" が 1 つあります。

だから私が試したのは:

$stmt = $db_pdo->prepare('SELECT date, table2_id, comments 
                          FROM table1 
                          LEFT JOIN table2 
                                 ON table1.table2_id = table2.table2_id 
                          LEFT JOIN table3 
                                 ON table2.table3_id = table3.table3_id 
                          WHERE user = "victor"');

そして明らかに、私の最初の (そしてこの行の多くの微調整されたバージョン) は失敗し、空のフェッチにつながりました。

最初の左結合を実行できますが、それでも 2 番目のテーブルの情報が表示されないようです。2 番目と 3 番目のテーブルには、最初のテーブルと同じ列はありません。(これは問題ではないと思いますが、間違っている可能性があります。)

私はさまざまな Web サイトでいくつかの情報を読みました。自分の問題を自分で解決するのが好きですが、達成しようとしていることが可能かどうかを尋ね、できるだけ早くそれを達成するように努めるのが最善だと思います。このような他の質問をいくつか読んだことがありますが、これらの質問は言うまでもなく、これの複雑さを見て、単に困惑しています。(それはその日の 1 つです...)

私も初めてpdoと準備済みステートメントを使用している可能性があります。それが問題だとは思いませんが、問題がある場合はお詫びします。私は MySQL の天才ではなく、データベースに多くの時間を費やしたことがありません。

また(許可されている場合は副次的な質問):foreachを使用する必要がありますか?それとも、実行後に $stmt を呼び出すだけで十分であると信頼できますか? (AKA は、表示される 1 つの結果に対して true/false を渡します)

4

1 に答える 1

0

次のような結合を試してください。

table3
LEFT JOIN table2
ON table3.table3_id = table2.table3_id
LEFT JOIN table1
ON table2.table2_id = table1.table2_id
于 2012-06-20T19:36:55.243 に答える