1

さて、今、私は別のクエリからのwhileループ内にクエリを持っています...しかし、私がやろうとしていることを行うためのより効率的な方法が必要です。1つのクエリで以下のスクリプトを実行できますか?そして、それはより効率的でしょうか?(私はそうなると思います)これが私が今持っているものです(実際のコードではありませんが、良い例です):

$sth = $dbh->prepare("SELECT * FROM Bugs LIMIT 5");
$sth->setFetchMode(PDO::FETCH_OBJ);
$sth->execute();
while($row = $sth->fetch()){
    $bugId = $row->id;
    echo 'Bug Name: ' . $row->name;
    echo '<br />';
    echo 'Affected Web Browsers: ';
    $sth2 = $dbh->prepare("SELECT * FROM AffectedBrowsers WHERE BugId = '$bugId'");
    $sth2->setFetchMode(PDO::FETCH_OBJ);
    $sth2->execute();
    $i = 1;
    while($row2 = $sth2->fetch()){
        if($i = 1){
            echo $row2->browser;
        }else{
            echo ', ' . $row2->browser;
        }
        $i++;
    }
}

私のテーブルは次のとおりです。1)「バグ」-このテーブルには、リストされているバグごとに1つの行があります。2)「AFfectedBrowsers」-このテーブルには、特定のバグの影響を受けるすべてのブラウザが含まれています。このテーブルは、「AffectedBrowsers」テーブルのbugId列を介して「Bugs」テーブルと関係があります。

注:$ iのインクリメントは、if/elseではなくforループで実行できることを認識しています。

更新:バグごとに1行だけ必要で、そのバグの影響を受けるすべてのブラウザーがリストされている列を結果セットに追加すると思います。

4

4 に答える 4

4
SELECT * FROM Bugs
INNER JOIN AffectedBrowsers ON Bugs.Id = AffectedBrowsers.BugId
LIMIT 5

それはあなたが探しているものですか?

于 2012-08-03T14:34:45.373 に答える
2
SELECT * FROM Bugs 
LEFT JOIN AffectedBrowsers 
ON Bugs.BugId = AffectedBrowsers.BugId 
LIMIT 5

影響を受けるブラウザがない場合でも、バグを一覧表示する場合。ちなみに、データを取得したくない列をリストアップする習慣を身に付ける必要があります。

于 2012-08-03T14:37:29.040 に答える
1
SELECT *
FROM Bugs
INNER JOIN 
(SELECT BugId, GROUP_CONCAT(Browser) Browsers FROM AffectedBrowsers GROUP BY BugId) Aff
ON Bugs.Id = Aff.BugId
于 2012-08-03T15:10:28.483 に答える
0

他の答えは良いです。ただし、バグの数を制限する必要があり、影響を受けるブラウザの数を気にしない場合は、次を使用してください。

  SELECT *
  FROM AffectedBrowsers
  WHERE BugID IN ( SELECT id FROM Bugs LIMIT 5 )

これは実際のサブクエリであることに注意してください。ただし、コードとは異なり、1つのステートメントに含まれているため、より高速である必要があります。

于 2012-08-03T14:41:24.653 に答える