2012-04-06 5 views
3

Основной вопрос!Группировка запроса с помощью php

У меня есть 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 

не миллион миль, но до сих пор не существует. Любая помощь очень ценится, спасибо!

+3

я мог бы помочь вам лучше, если бы я вырос в обществе, охвативших выращенной пищу ... Я никогда не слышал о каком-либо из этих сортов.:/ – Kristian

ответ

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

+0

Извините, что ... опечатка, когда я его переделал. –

+0

Работает! Большое спасибо Натаниэлю. – trh88

-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

+0

@zaf Он обновил свой код? – Norse

+0

Вы более чем рады разработать для него весь проект OP :) – Norse

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 - это более чистый способ обойти это, хотя, если он предназначен для анализа программ. –

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

Вам не хватает 'group по f.id, f.fruitname', хотя второй может быть пропущен в mysql –

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 
Смежные вопросы