Тема: Связывание двух таблиц и групировка

Скажу сразу, начала изучать php/mysql , не ругайте сильно, столкнулся с трдностью вывода категорий и всех пренадлежавших данной категории товаров.

Есть 2 таблицы:

1 таблица - для категорий (products_category)

id (primary key)
название категории

2 таблица - для товаров (products_items)

id (primary key)
products_category (заносится id категории)
description
img

Нужен запрос с групировкой по категориям, что бы выводил :
Категория 1
-товар А
-товар Б
Категория 2
-товар Д
Категория 3
-товар П
-товар В

Я сделал такой запрос:

SELECT *
        FROM products_category
        JOIN products_items
        WHERE products_category.id = products_items.products_category

и он выводит следующие :

Категория 1
-товар А
Категория 1
-товар Б
Категория 2
-товар Д
Категория 3
-товар П
Категория 3
-товар В

дублирует категории, я пытался вставить Group by

2

Re: Связывание двух таблиц и групировка

Все вы правильно делали, только необходимо добавить группировку таким образом.
GROUP BY категория, товар

В этом случае, категории будут повторяться вместе с названиями товаров.

Если такой вывод не даст возможности с ним работать, то придется делать иначе, уже через PHP: сперва выбирать запросом категории и затем дополнительным запросом товары для каждой категории.

3

Re: Связывание двух таблиц и групировка

у меня в данный момент в таблице вбито по 2 товара (2 стрчоки) на каждую категорию. когда делаю GROUP BY выводит почему то 1 топар с одной категории, а если без групировки то выводит [<название категории><товар>],[<название категории><товар>] что не есть правильно, хочется получить

[название категории]
<товар 1>
<товар 2>
<............>

[название категории2]
<товар 1>
<товар 2>

Немного переделал запрос, так тоже как почитал в интернете можно

$result = mysql_query("SELECT products_items.id, products_items.description_ru, products_items.img, products_category.id, products_category.menu_ru FROM products_items,products_category WHERE products_items.products_category=products_category.id
") or die(mysql_error());

Через php это нужно запрос в запросе? Просто на данный момент я сделал, категории выводятся

while ($line = mysql_fetch_array($result)) {

echo $line[menu_ru]; // вывод названий категории, есть еще нюанс , я не могу сделать GET по конструкции (это думаю облегчило бы задачу)

Здесь надо еще один запрос на вывод товаров?

}

4

Re: Связывание двух таблиц и групировка

kolxoznik1 сказал:

хочется получить
[название категории]
<товар 1>
<товар 2>
<............>

Так получить не получится.

Выбираем категории, затем в функции product() выбираем по категории продукты. Получается выполнение запроса в запросе.

function product($line) {
  $result = mysql_query('SELECT product... WHERE products_category.id = ' . $line['id'] . '
') or die(mysql_error());
// и так далее.
}

$result = mysql_query("SELECT products_items.id, products_items.description_ru, products_items.img, products_category.id, products_category.menu_ru FROM products_items,products_category WHERE products_items.products_category=products_category.id
") or die(mysql_error());

while ($line = mysql_fetch_array($result)) {
echo $line['menu_ru'];

product($line);

}

5

Re: Связывание двух таблиц и групировка

хочется получить
[название категории]
<товар 1>
<товар 2>
<............>

так разве выше предложеный вами код не поможет ?

по идеи код должен как то так работать

<?php

include('db.php');
    
function product($line) {
  $result = mysql_query('SELECT img, description_ru, products_category FROM products_items WHERE products_category = ' . $line['id'] . '    //   выводим продукты, по конкретной категории, сверяя ID категории с полем товаров products_category
') or die(mysql_error());

echo '<img src="'.$line[img].'">';
echo $line[description_ru];

}
    
$result = mysql_query("SELECT products_category.id, products_category.menu_ru FROM products_category ") or die(mysql_error());   // выводим категории, названия и id категории
    
    
while ($line = mysql_fetch_array($result)) {

    
echo $line['menu_ru']; 

product($line);

    }

?>

а сделав так

<?php

include('db.php');
    
function product($line) {
  $result = mysql_query('SELECT* FROM products_category WHERE products_category.id = ' . $line['id'] . '
') or die(mysql_error());

echo '<img src="'.$line[img].'">';
echo $line[description_ru];

}
    
$result = mysql_query("SELECT * 
                        FROM products_items,products_category 
                        WHERE products_items.products_category=products_category.id") or die(mysql_error());
    
    
while ($line = mysql_fetch_array($result)) {
    

    
echo $line['menu_ru']; 

product($line);


    }

?>

отобрадилось следующее

1) появились названия категорий только в которые не пустые ...
2) отображение :

Категория А
- товар А
Категория А
- товар Б
Категория Б
- товар М

а не

Категория А
- товар А
- товар Б
Категория Б
- товар М

Самое обидное что не вижу даже друго варианта как обойти данную проблему, решив каким нибудь другим способом.

6

Re: Связывание двух таблиц и групировка

Первым запросом выбираем категории. Не надо объединять таблицы, просто выберите категории простейшим запросом.

SELECT * FROM `products_category`

Второй запрос будет тоже простым:

SELECT * FROM `products_items` WHERE `products_category` = 1

Только вместо единички надо подставлять идентификатор категории передаваемый в параметре функции product().

Добавьте в функции product() цикл while, иначе она не имеет смысла. Я дал не рабочий код, а только пример, который надо довести до рабочего состояния.

7

Re: Связывание двух таблиц и групировка

Рабочий код

выкладываю рабочий код, может кому понадобится и кто то заглянет сюда, сам искал больше 4 часов по просторам интернета в поисках запроса, а решил проблему благодоря форуму через функцию  smile

<?php

include('db.php');
    
function product($line) {
    $result = mysql_query('SELECT * FROM products_items WHERE products_category = ' . $line['id'] . '') or die(mysql_error());

    while ($line = mysql_fetch_array($result)) {
  
  
    echo '<div><img src="'.$line[img].'"><div>
        <div> '.$line[description_ru].' </div>';
 
    }
}
    
$result = mysql_query("SELECT * FROM products_category") or die(mysql_error());
    
while ($line = mysql_fetch_array($result)) {
    
echo '<b>'.$line['menu_ru'].'</b><br>'; 

product($line);

}

?>

8

Re: Связывание двух таблиц и групировка

kolxoznik1 сказал:

Рабочий код

Очень хорошо. А с маленькими поправками будет еще лучше.

<?php

include('db.php');
    
function product($line) {
    if ($result = mysql_query('SELECT * FROM products_items WHERE products_category = ' . $line['id']) {
        while ($line = mysql_fetch_array($result)) {
            echo '<div><img src="'.$line['img'].'"><div>
                <div> '.$line['description_ru'].' </div>';
        }
    }
}
    
if ($result = mysql_query("SELECT * FROM products_category") {
    while ($line = mysql_fetch_array($result)) {
        echo '<b>'.$line['menu_ru'].'</b><br>'; 

        product($line);
    }
}

?>