2012-04-06 56 views
3

基本問題!用php分組查詢

我有2個表

PRODUCE

+-----+--------------+ 
    | 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 

不是一個百萬英里的路程,但仍然不存在。任何幫助非常感謝,謝謝!

+3

我將能夠更好地幫助你,如果我想在這擁抱種植的食物社會成長起來的......我從沒聽說過任何這些品種。:/ – Kristian 2012-04-06 23:08:40

回答

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

$ current_produce從未設置或更新... – zaf 2012-04-06 23:21:01

+0

對不起,我修改它時發生錯字。 – 2012-04-06 23:23:19

+0

做這份工作!非常感謝納撒尼爾。 – trh88 2012-04-07 08:19:13

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

那麼當另一個項目插入數據庫時​​會發生什麼?像橙色? – zaf 2012-04-06 23:20:24

+0

@zaf他會更新他的代碼? – Norse 2012-04-06 23:21:42

+0

你非常歡迎爲他完成OP的整個項目:) – Norse 2012-04-06 23:23:52

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

這樣做的缺點是每個品種都會有一個前面的逗號,每個水果沒有尾隨短劃線,也沒有包含原始文章中指出的html格式。但是print_r是一個更清晰的方法,但是,如果它是用於編程式解析的話。 – 2012-04-06 23:58:48

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,請告訴我。

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想想緩衝這些結果。在大型數據庫和許多同時使用的用戶中,當您必須下載所有數據並每次將其存儲在本地時,您的應用程序可能會明顯變慢。

+0

你錯過了'f.id,f.fruitname'組,儘管第二個可以在mysql中忽略 – 2012-04-07 02:12:01

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