2012-04-06 41 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