3

基本的な質問!

私は2つのテーブルを持っています

生産

   +-----+--------------+  
   | id  |  fruit_name  |
   +--------------------+
   | 1   |   Apple      |
   | 2   |   Banana     |
   | 3   |   Carrot     |
   +-----+--------------+

品種

   +-----+---------------+----------------+
   | id  |  fk_fruit_id  |  variety_name  |
   +-----+---------------+----------------+
   | 1   |   1           |    Cox         |
   | 2   |   1           |    Braeburn    |
   | 3   |   2           |    Chester     |
   | 4   |   3           |    Kotaka      |
   | 5   |   3           |    Imperial    |
   | 6   |   3           |    Oneal       |
   +-----+---------------+----------------+

果物ごとの品種のリストを出力したいのですが、例えば

APPLE - Cox, Braeburn

BANANA - Chester

CARROT - Kotaka, Imperial, Oneal

私の現在のコードは

$query   = "SELECT * FROM produce, varieties WHERE produce.id = varieties.fk_fruit_id"; 

$result  = mysql_query($query) or die('Error : ' . mysql_error()); 
while ($row     = mysql_fetch_array($result, MYSQL_ASSOC)) { 

$produce_fruit_code   = $row['fruit_code']; 
$variety_name   = $row['variety_name']; 

echo $produce_fruit_code.' - '.$variety_name.'<br/>';

}

出力:

Apple - Cox
Apple - Braeburn
Banana - Chester
Carrot - Kotaka
Carrot - Imperial
Carrot - Oneal

百万マイルも離れていませんが、まだそこにはありません。どんな助けでも大歓迎です、ありがとう!

4

6 に答える 6

1

MySQL を使用している場合は、グループ化で group_concat 拡張機能を使用できます。次のようなもの:

SELECT 
   f.fruitname as fruit, 
   GROUP_CONCAT(distinct v.varietyname separator ',') as variety  
FROM fruit f JOIN varieties v ON produce.id = varieties.fk_fruit_id;

または類似。申し訳ありませんが、私のSQLはかなり錆びています。詳細については、この記事 http://www.mysqlperformanceblog.com/2006/09/04/group_concat-useful-group-by-extension/ ともちろんこちらをご覧ください: http://dev.mysql.com/doc/refman /5.0/en/group-by-functions.html

MySQL を使用しておらず、データベースが group_concat をサポートしていない場合は、それらの結果をバッファリングすることを検討してください。大規模なデータベースで多数の同時ユーザーがいる場合、すべてのデータをダウンロードして毎回ローカルに保存する必要がある場合、アプリケーションの速度が大幅に低下する可能性があります。

于 2012-04-06T23:43:58.897 に答える
1

おそらく、それを行うために 1 つの分厚い SQL ステートメントを取得できますが、私は配列を使用したデータ ジャグリングを選択します。

例(テストされておらず、フォーマットを許してください):

$query   = "SELECT * FROM produce, varieties WHERE produce.id = varieties.fk_fruit_id";     
$result  = mysql_query($query) or die('Error : ' . mysql_error()); 

$res=array();

while ($row     = mysql_fetch_array($result, MYSQL_ASSOC)) { 

    $produce_fruit_code   = $row['fruit_code']; 
    $variety_name   = $row['variety_name']; 

    if(isset($res[$produce_fruit_code])){
        $res[$produce_fruit_code]+=','.$variety_name;
    }else{
        $res[$produce_fruit_code]=$variety_name;
    }

}        
print_r($res);
于 2012-04-06T23:18:18.297 に答える
0

これですべてが得られるわけではありませんが、必要なもののほとんどが得られます。問題のあるエッジケースがいくつかあります。

$query   = "SELECT * FROM produce, varieties WHERE produce.id = varieties.fk_fruit_id"; 
$result  = mysql_query($query) or die('Error : ' . mysql_error()); 

$produce_fruit_code = "";
while ($row     = mysql_fetch_array($result, MYSQL_ASSOC)) { 
  if ($produce_fruit_code != $row['fruit_code'])
  {
    $produce_fruit_code = $row['fruit_code'];
    echo "<br/>".$produce_fruit_code." - ". $row['variety_name'];
  } else {
    echo ", ".$row['variety_name']; 
  }
}
于 2012-04-06T23:11:35.203 に答える
0
$query   = "SELECT * FROM produce, varieties WHERE produce.id = varieties.fk_fruit_id"; 

echo "<dl>";

$result  = mysql_query($query) or die('Error : ' . mysql_error()); 
while ($row     = mysql_fetch_array($result, MYSQL_ASSOC)) { 

    if($row['fruit_name'] != $current_fruit_name) {
        $current_fruit_name = $row['fruit_name'];
        echo "<dt>$current_fruit_name</dt>"; 
     }
echo "<dd>" . $row['variety_name'] . "</dd>";

}

    エコー "";

質問のような定義リストを作成する CSS が必要な場合はName - X,Y,Z、お知らせください。

于 2012-04-06T23:27:30.930 に答える
0

これを直接照会できます

SELECT 
   f.fruitname as fruit, 
   GROUP_CONCAT(distinct v.varietyname separator ',') as variety  
FROM fruit f JOIN varieties v ON produce.id = varieties.fk_fruit_id;
GROUP BY produce.id
于 2012-04-07T00:07:28.813 に答える
-3

whileループ内ですべてを配列に並べ替えます。これはうまくいくはずです:

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { 

   $produce_fruit_code   = $row['fruit_code']; 
   $variety_name   = $row['variety_name']; 

   if ($produce_fruit_code == "Apple") {
   $apple_array[] = $variety_name;
   }
   if ($produce_fruit_code == "Banana") {
   $banana_array[] = $variety_name;
   }
   if ($produce_fruit_code == "Carrot") {
   $carrot_array[] = $variety_name;
   }

}

echo "Apples:" . implode(", ", $apple_array) . "<br/>";
echo "Bananas:" . implode(", ", $bananas_array) . "<br/>";
echo "Carrots:" . implode(", ", $carrots_array) . "<br/>";
于 2012-04-06T23:17:35.617 に答える