категории продуктов - PullRequest
       15

категории продуктов

0 голосов
/ 20 августа 2009

У меня простой вопрос, но я не знаю, какой термин мне следует использовать, чтобы найти ответ (английский не мой родной язык).

У меня есть классическая база данных продуктов и категорий.

CREATE TABLE IF NOT EXISTS `a` (
  `id_a` int(11) NOT NULL auto_increment,
  `type` varchar(255) NOT NULL,
  PRIMARY KEY  (`id_a`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;

CREATE TABLE IF NOT EXISTS `b` (
  `id_b` int(11) NOT NULL,
  `id_a` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY  (`id_b`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Где b.id_a - это внешний ключ для a.id_a

Я хочу получить иерархию всех этих слов, как

ЗНАЧЕНИЕ 1

  • b_value_1
  • b_value_2

ЗНАЧЕНИЕ 2

  • b_value_11
  • b_value_12

ЗНАЧЕНИЕ 3

  • b_value_21
  • b_value_22
  • b_value_23

Запрос не имеет значения, но я получаю такой ответ:

VALUEOF-TABLE-A | VALUEOF-TABLE-B
A VALUE 1       | b_value_1
A VALUE 1       | b_value_2

и т. Д.

Мой текущий код выглядит примерно так:

$categ = '';
while ($row = mysql_fetch_row ($ressource))
{
   if ($row['VALUEOF-TABLE-A']!=$categ) 
   { 
     $categ = $row['VALUEOF-TABLE-A']; 
     echo '<h3>', $categ, '</h3>';
   }
   echo '<h4>', $row['VALUEOF-TABLE-B'], '</h4>';
}

Но мне не очень нравится идея переменной категории, будь то строка или идентификатор. Есть ли другой способ получить данные и отобразить их?

В идеале я хотел бы, чтобы объект дерева имел только один узел для идентичных потомков.

Надеюсь, ты понял, чего я хочу.

Ответы [ 2 ]

1 голос
/ 02 сентября 2009

Пример, который дает Чико, находится на правильном пути, но имеет проблему: когда есть много категорий, скрипт также выполнит много запросов, что неэффективно. Следующий пример гораздо эффективнее:

$categories = array();
$category_array = mysql_query("SELECT id_a, type FROM a");
while ($category = mysql_fetch_array($category_array))
{
    $category['products'] = array();
    $categories[$category['id_a']][] = $category;
}

$product_array = mysql_query("SELECT * FROM b");
while ($product = mysql_fetch_array($product_array))
{
    $categories[$product['id_a']]['products'][] = $product
}

foreach($categories as $category) {
    echo $category['type'];
    foreach ($category['products'] as $product) {
         echo $product['name'];
    }
}

В качестве дополнительного бонуса это также более четко отделяет получение данных от вывода.

1 голос
/ 20 августа 2009

При работе с внешними ключами в Mysql вы должны использовать движок InnoDB вместо MyISAM.

Кажется, есть проблема в концепции таблицы b, id_b должен быть первичным ключом, а не id_a.

Чтобы решить вашу проблему, возможно, вам следует сначала получить список id_a, а затем сделать один запрос выбора с помощью id_a, чтобы выбрать соответствующий id_b с помощью JOIN.

РЕДАКТИРОВАТЬ: сценарий должен выглядеть следующим образом:

$category_array = mysql_query("SELECT id_a, type FROM a");
while ($category = mysql_fetch_array($category_array))
{
    echo $category['type'];
    $product_array = mysql_query("SELECT * FROM b WHERE id_a = $id_a");
    while ($product = mysql_fetch_array($product_array))
    {
         echo $product['name'];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...