2012-03-20 1 views
0

私はすべての基本的な食物データを取得するPHP関数を書こうとしています。それから、その食べ物の食材を入手してください。以前のクエリのデータを使用して複数の選択を行うにはどうすればよいですか?

したがって、最初のクエリでは、受け取った各行に「フードID」があります。

その後、私はそれぞれの食品のIDを取りたい...(私の問題がある場合、これはあるかもしれない)

その後、私は提供のIDを持っているfood_ingテーブルから成分を選択します。 (複数の選択肢に問題がある可能性もあります)

各食品に複数の成分が戻ってきます。これは非常に大きな配列そのものになります。

私のセットアップにもう少しコンテキストを与えるために、私は3つのテーブルを持っています。食べ物、food_ratings、food_ing。

food_ingは成分がいっぱいです。各行には数、成分、それに関連するfood_idがあります。

私は何を求めていますか...この情報を照会して返す最良の方法は何でしょうか?各食品と

-An配列は、それは、ID、説明、種類...もともと照会、すべての食品のすべての成分と

-An配列です。 (データを取得した後にAS3側でそれぞれの食品に並べ替えることができます)

私はこのような考えをしていました。しかし、それは動作していません。私は自分の選択した食材のループを構築している私のループ内で働くために各食品IDを取得するように見えることはできません。私はこれを使用していると思います

誰かが1つのクエリでこれを行う方法を説明できるなら、何が素晴らしいだろうか?

function getFoods($start, $limit) { 

    $qOne = mysql_query("SELECT a.id, a.name, a.type, AVG(b.r) AS fra, COUNT(b.id) as tvotes FROM `foods` a LEFT JOIN `foods_ratings` b ON a.id = b.id GROUP BY a.id ORDER BY fra DESC, tvotes DESC LIMIT $start, $limit;"); 

    $arrOne = mysql_fetch_array($qOne); 

    $i = 0; 
    $qry = ""; 
    foreach ($arrOne as $value) { 
     $fid = $value['id']; 
     if ($i > 0) 
      $qry .= " UNION "; 
     $i++; 
     $qry .= "SELECT fid, ing, amount FROM foods_ing WHERE fid='$fid'"; 
    } 

    $qTwo = mysql_query($qry); 

      /* 
      if this helps anyone...I'm using amfphp to communicate with an AS3 project. 
      also returning $qOne works. so no issues there. The issue is just with $qTwo. 
      Unless the reccomendation is to somehow do this with 1 query. 
      */ 

    return array($qOne, $qTwo); 
} 

実際、私はそれがなぜ奇妙に見えているのか分かりました。それは1行しか得ていないようだ。私はこれを試みたが、まだ問題がある。今何も返されていません

EDIT:別のループを共有しようとしました。今度は最初の結果は機能しません...ループを使用して結果を返すか、

ですが、少なくともこのループでは、正しい結果が返されます(2番目の配列用)

function getFoods($sort, $start, $limit) { 

      $qOne = mysql_query("SELECT a.id, a.name, a.type, AVG(b.r) AS fra, COUNT(b.id) as tvotes FROM `foods` a LEFT JOIN `foods_ratings` b ON a.id = b.id GROUP BY a.id ORDER BY fra DESC, tvotes DESC LIMIT $start, $limit;"); 

      $i = 0; 
     $qry = ""; 
     while ($row = mysql_fetch_array($qOne)) { 
      $fid = $row['id']; 
      if ($i > 0) 
       $qry .= " UNION "; 
      $i++; 
      $qry .= "SELECT fid, ing, amount FROM foods_ing WHERE fid='$fid'"; 
     } 

      $qTwo = mysql_query($qry); 

      return array($qOne, $qTwo); 
     } 

EDIT:

は、ここ1、クエリでそれをすべてやろうとしているの別の試みです。しかし、それだけで少なくとも数成分

があるので(それはINGのために戻って来るの配列である必要があり、それはINGと量のために取得する最初の値を返すだ
SELECT c.ing, c.amount, a.id, a.name, a.type, AVG(b.r) AS fra, 
COUNT(b.id) as tvotes 
FROM foods a 
LEFT JOIN foods_ratings b ON a.id = b.id, foods_ing c 
GROUP BY a.id 
ORDER BY fra DESC, tvotes DESC 
LIMIT $start, $limit 
+0

mysql_fetch_array()を誤って使用しているようです。 1行だけを返すので、foreachは1行の列をループします。つまり、$ value ['id']は存在しません。各行に対してループ内の関数を呼び出さなければなりません。 – flo

答えて

0

[OK]をので....

ソリューションは、whileループで入力皆のため

while ($row = mysql_fetch_array($qOne)) { 
      $fid = $row['id']; 
      if ($i > 0) 
       $qry .= " UNION "; 
      $i++; 
      $qry .= "SELECT fid, ing, amount FROM foods_ing WHERE fid='$fid'"; 
     } 

おかげでしたが、私は自分でwhileループを知りました。私は人を助けるための答えを必要に応じて投稿します。

これは、UNIONを使用してクエリを組み合わせることを推奨するものです。

2

あなたは複数のステートメントのためのmysql_query()を使用することはできません

投稿のようなコードを使用している場合は、UNIONの使用方法にエラーがあります。変数$iをインクリメントしていません。

whileループを改善して$ qOneを再度有効にするには、結果セットポインタ$qOneをリセットする必要があります。

$i = 0; 
    $qry = ""; 
    while ($row = mysql_fetch_array($qOne)) { 
     $fid = $row['id']; 
     if ($i > 0) 
      $qry .= " UNION "; 
     $i++; 
     $qry .= "SELECT fid, ing, amount FROM foods_ing WHERE fid='$fid'"; 
    } 
    mysql_data_seek($qOne); // Reset the pointer $qOne 
    $qTwo = mysql_query($qry); 

    return array($qOne, $qTwo); 
+0

これは、その食品IDを持っている成分の配列をing varとして成分配列と一緒に行を返すように見えません – brybam

+0

私の質問が更新されました。うまくいけば状況をよりよく説明します。 – brybam

+0

その正確なループを使用すると、私は "F"が配置されるのを見た "fid"のためにいくつかの奇妙な結果を得ています。私のデータベースには、IDの1,2,3,4のすべてのテスト食べ物があります。だから、それらの "fid"だけで、4つのクエリがあるはずです。 – brybam

0

一緒に複数のテーブルを結合するためにJoinsを使用してください。

+0

ええ、しかし、それぞれの "ing"は、成分自体の配列になります。 – brybam

+0

私の質問が更新されました。うまくいけば状況をよりよく説明します。 – brybam

1

あなたのsqlは "union"を使用しなければなりません ";"

...//your code 
    $i=0; 
    foreach ($row as &$value) { 
     $fid = $value['id']; 
     if($i <> 0) 
      $qry .=" UNION "; 
     $qry = $qry . "(SELECT ing, amount FROM foods_ing WHERE fid='$fid') "; 
    } 
    ...//continue with your code 
+0

私は自分のコードを更新しましたが、まだ運がありません。おそらく問題は以前のクエリからIDを取得する方法ですか?私は私の質問を更新しました。うまくいけば状況をよりよく説明します。 – brybam

+0

私はそのループを試しましたが(いくつかの小さな変更を加えれば、上が上になることがあります)、何らかの理由で前回のクエリの行からidが正しく取得されていません。私はそれが実行される前に$ qry文字列がどのように見えるかを上にポストしました。 1 2 3 4だけあるはずですが、何とか複数の1をやっていて何とかFがそこに入っています。私はどのように考えている。私のmysqlデータベースに電話していて、今見ているのは4つの食べ物とIDだけです。1 2 3 4。最初のクエリが想定していたものを返すことを確認しました。 – brybam

0

おそらく$rowを返して、クエリの代わりに後で使用できますか?

function getFood($start, $limit) { 

    $one = mysql_query("SELECT a.id, a.name, a.type, AVG(b.r) AS fra, COUNT(b.id) as tvotes FROM `foods` a LEFT JOIN `foods_ratings` b ON a.id = b.id GROUP BY a.id ORDER BY fra DESC, tvotes DESC LIMIT $start, $limit;"); 

    $row_one = mysql_fetch_array($one); 

    $qry = ""; 

    foreach ($row_one as &$value) { 
     $fid = $value['id']; 
     $qry = $qry . "SELECT ing, amount FROM foods_ing WHERE fid='$fid';"; 
    } 

    $two = mysql_query($qry); 
    $row_two = mysql_fetch_array($two); 

    return array ($row_one, $row_two); 
} 
+0

私はクエリを返す場合にのみ動作します。 (少なくとも最初のものについては)私はphpやmysqlについてよく知らない。 amfphpを使って私のAS3プロジェクトと話しているので、おそらく動作していますか?違いがあるかどうかは分かりません。私の最大の問題は、最初のクエリーからすべてのIDを取得して2番目のクエリーを実際に作成することにあります。私は私の質問を更新しました。うまくいけば状況をよりよく説明します。 – brybam

関連する問題