2012-04-06 8 views
3

Grundlegende Frage!Gruppieren einer Abfrage mit PHP

Ich habe 2 Tabellen

PRODUCE

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

SORTEN

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

Ich mag würde eine Liste der Sorten pro Frucht zur Ausgabe z.B.

APPLE - Cox, Braeburn 

BANANA - Chester 

CARROT - Kotaka, Imperial, Oneal 

Mein aktueller Code ist

$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/>'; 

} 

die Ausgänge:

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

nicht eine Million Meilen entfernt, aber immer noch nicht da. Jede Hilfe wird sehr geschätzt, danke!

+3

abfragen kann ich in der Lage sein würde, um Sie besser zu helfen, wenn ich in einer Gesellschaft aufgewachsen war, die Nahrung angebaut umarmten ... Ich habe noch nie eine dieser Sorten gehört.:/ – Kristian

Antwort

0

Dies wird Sie nicht den ganzen Weg bringen, aber es wird Ihnen das meiste von dem, was Sie wollen. Es gibt einige Randfälle, die problematisch sind.

$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']; 
    } 
} 
+0

$ current_produce wird nie gesetzt oder aktualisiert ... – zaf

+0

Sorry, dass ... Typo, wenn ich es überarbeitet habe. –

+0

Macht den Job! Vielen Dank Nathaniel. – trh88

-3

Sortieren Sie alles in Arrays in Ihrer while Schleife. Dies sollte funktionieren:

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/>"; 
+1

Was passiert also, wenn ein anderer Artikel in die Datenbank eingefügt wird? Wie eine Orange? – zaf

+0

@zaf Er würde seinen Code aktualisieren? – Norse

+0

Sie sind mehr als willkommen, das OP-Projekt für ihn zu erarbeiten :) – Norse

1

Sie wahrscheinlich eine klobige SQL-Anweisung bekommen konnte, dass für Sie zu tun, aber ich würde für Daten entscheiden mit Arrays jonglieren.

Zum Beispiel (nicht getestet und die Formatierung entschuldigen):

$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); 
+0

Der Nachteil ist, dass es für jede Sorte ein vorangestelltes Komma geben wird, kein Bindestrich für jede Frucht, und enthält keine HTML-Formatierung, die im ursprünglichen Post angegeben wurde . print_r ist jedoch ein sauberer Weg, wenn es um programmatisches Parsen geht. –

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>"; 

} 

echo "";

Wenn Sie einige CSS möchten, die eine Definitionsliste wie die Name - X,Y,Z wie in der Frage aussehen lassen, lassen Sie es mich wissen.

1

Wenn Sie MySQL verwenden, können Sie die Erweiterung group_concat beim Gruppieren verwenden. Etwas in der Art von:

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; 

oder ähnlich. Tut mir leid, mein SQL ist jetzt ein wenig eingerostet. Weitere Blick auf diesen Artikel http://www.mysqlperformanceblog.com/2006/09/04/group_concat-useful-group-by-extension/ und natürlich hier: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

Wenn Sie mit MySQL und Ihre Datenbank nicht funktionieren nicht Group_concat darüber nachdenken, diese Ergebnisse unterstützt Pufferung. In großen Datenbanken und mit vielen gleichzeitigen Benutzern kann Ihre Anwendung erheblich langsamer werden, wenn Sie alle Daten herunterladen und jedes Mal lokal speichern müssen.

+0

Sie vermissen die 'Gruppe nach f.id, f.Fruchtname', obwohl die zweite in mysql weggelassen werden kann –

0

du direkt

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