2

以下の例のように、5 行のデータを取得するクエリがあります。

$query = "SELECT ref,user,id FROM table LIMIT 0, 5"; 
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_array($result))
{
$ref = $row['ref'];
}

以下のように、各結果内でクエリを実行したい

$query = "SELECT ref,user,id FROM table LIMIT 0, 5"; 
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_array($result))
{
 $ref = $row['ref'];
$query = "SELECT domain,title FROM anothertable WHERE domain = '$ref'";
$result = mysql_query($query) or die(mysql_error());
if (mysql_num_rows($result) )
{
$title = $row['title'];
} else {
$title = "No Title";
}
echo "$ref - $tile";
}

しかし、何らかの理由で、その中にクエリを追加すると最初の行しか表示されません。5つのクエリすべてを実行できるようです。

4

8 に答える 8

2
SELECT 
    t1.ref, 
    t1.user,
    t1.id,
    t2.domain,
    t2.title
FROM 
    table AS t1
    LEFT JOIN anothertable AS t2 ON
        t2.domain = t1.ref
LIMIT
    0, 5
于 2012-10-08T09:40:35.933 に答える
2

問題は、while サイクル内で同じ variable を使用し、$resultその後オーバーライドされることです。$resultwhile サイクルで別の変数名を使用します。

于 2012-10-08T09:41:26.263 に答える
1

while ループで $query の値を変更します。変数名を別のものに変更します。

元:

$query = "SELECT ref,user,id FROM table LIMIT 0, 5"; 
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_array($result))
{
 $ref = $row['ref'];
$qry = "SELECT domain,title FROM anothertable WHERE domain = '$ref'";
$rslt = mysql_query($qry) or die(mysql_error());
if (mysql_num_rows($rslt) )
{
$title = $row['title'];
} else {
$title = "No Title";
}
echo "$ref - $tile";
}
于 2012-10-08T09:40:19.053 に答える
1

次を使用します。

$query = "SELECT ref,user,id FROM table LIMIT 0, 5"; 
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_array($result))
{
    $ref = $row['ref'];
    $query_domain = "SELECT domain,title FROM anothertable WHERE domain = '$ref'";
    $result_domain = mysql_query($query_domain) or die(mysql_error());
    if (mysql_num_rows($result_domain) )
    {
        $row_domain = mysql_fetch_row($result_domain);
        $title = $row_domain['title'];
    } else {
        $title = "No Title";
    }
    echo "$ref - $title";
}
于 2012-10-08T09:41:37.280 に答える
1

これは論理的な問題です。ループの外側と内側で同じ変数名であるため、そのようになります。

説明:

$query = "SELECT ref,user,id FROM table LIMIT 0, 5"; 
$result = mysql_query($query) or die(mysql_error());
// Now $results hold the result of the first query

while($row = mysql_fetch_array($result))
{
    $ref = $row['ref'];

    //Using same $query does not affect that much
    $query = "SELECT domain,title FROM anothertable WHERE domain = '$ref'";    

    //But here you are overriding the previous result set of first query with a new result set
    $result = mysql_query($query) or die(mysql_error());
    //^ Due to this, next time the loop continues, the $result on whose basis it would loop will already be modified

//..............

解決策 1:

内部結果セットに同じ変数名を使用しない

$query = "SELECT ref,user,id FROM table LIMIT 0, 5"; 
$result = mysql_query($query) or die(mysql_error());

while($row = mysql_fetch_array($result))
{
    $ref = $row['ref'];
    $query = "SELECT domain,title FROM anothertable WHERE domain = '$ref'";    
    $sub_result = mysql_query($query) or die(mysql_error());
    // ^ Change this variable so that it does not overrides previous result set

解決策 2: 二重クエリの状況を回避します。結合を使用して、1 回のクエリ呼び出しでデータを取得します。(注: サーバー上のクエリの数を最小限に抑えるために、常にクエリの最適化を試みる必要があります。 )

SELECT 
    ref,user,id 
FROM 
    table t
INNER JOIN 
    anothertable t2 on t.ref t2.domain
LIMIT 0, 5
于 2012-10-08T09:46:17.927 に答える
0

SQL 結合について学習します。

SELECT table.ref, table.user, table.id, anothertable.title
FROM   table LEFT JOIN anothertable ON anothertable.domain = table.ref
LIMIT  5
于 2012-10-08T09:40:44.017 に答える
0

$resultループ内の値を変更しています。2 番目のクエリを変更して、別の変数を使用します。

于 2012-10-08T09:41:21.953 に答える
0

同じ名前を 2 回使用しているため、適切な結果が得られません。この編集のように別の名前を使用してください。

$query = "SELECT ref,user,id FROM table LIMIT 0, 5"; 
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_array($result))
{
    $ref = $row['ref'];
    $query1 = "SELECT domain,title FROM anothertable WHERE domain = '$ref'";
    $result1 = mysql_query($query1) or die(mysql_error());
    if (mysql_num_rows($result1) )
    {
        $title = $row['title'];
    } else {
        $title = "No Title";
    }
    echo "$ref - $tile";
}
于 2012-10-08T09:42:13.417 に答える