Jump to content
  • 0

Помогите придумать структуру таблиц


Great Rash
 Share

Question

Нужно создать вот такой прайс на сайте:


+--------+-------------+-------------+-------------+
| | Категория 1 | Категория 2 | Категория 3 |
+--------+-------------+-------------+-------------+
| Цена 1 | 10 руб. | 30 руб. | 25 руб. |
+--------+-------------+-------------+-------------+
| Цена 2 | 50 руб. | 100 руб. | 70 руб. |
+--------+-------------+-------------+-------------+

Как бы так организовать таблицы, чтоб было потом минимум запросов к БД? Пока ничего лучше не придумал чем создать 2 таблицы (категория и цена) и делать в цикле запросы к БД, чтоб собрать в массив цены по всем категориям. У меня очень мало опыта в БД, да и решение кажется кривым, что посоветуете?

Link to comment
Share on other sites

22 answers to this question

Recommended Posts

  • 0


+--------+--------+-----------+
| Цена 1 | Цена 2 | Категория |
+--------+--------+-----------+
| 10 | 50 | 1 |
+--------+--------+-----------+
| 30 | 100 | 2 |
+--------+--------+-----------+
| 25 | 70 | 3 |
+--------+--------+-----------+

Как-то так мне видится всё это.

Link to comment
Share on other sites

  • 0

В общем я так и придумал, но тогда придется делать запрос столько раз, сколько у меня категорий, разве нет? Сначала мне надо будет выбрать все цены из первой категории, потом из второй, потом из третьей и т.д. А если категорий будет 100500, получится 100500 запросов к БД, насколько сильно это нагрузит сервер?

Или есть какой-то способ выборки о котором я не знаю.

Link to comment
Share on other sites

  • 0

Не совсем понял для чего делать столько запросов, на этом примере можешь показать, что на выходе должно получиться, просто есть group by, order by и where `Категория` = (к примеру) 1

Link to comment
Share on other sites

  • 0

Да вроде максимально развернуто написал... напишу еще раз. Мне нужно получить на выходе таблицу как в первом посте, сам уже допер до того, что надо завести в БД две таблицы, одну с id категории и именем категории


+-------------+---------------+
| id_category | name_category |
+-------------+---------------+
| 1 | Категория 1 |
+-------------+---------------+
| 2 | Категория 2 |
+-------------+---------------+
| 3 | Категория 3 |
+-------------+---------------+

... и вторую с ценами по каждой категории:


+----------+---------+---------+----------+
| id_price | price_1 | price_2 | category |
+----------+---------+---------+----------+
| 1 | 10 | 50 | 1 |
+----------+---------+---------+----------+
| 2 | 30 | 100 | 2 |
+----------+---------+---------+----------+
| 3 | 25 | 70 | 3 |
+----------+---------+---------+----------+

Потом я вывожу это на страницу:


// считаю сколько у меня всего категорий
$query = mysql_query("SELECT COUNT(name_category) FROM category");
$cat_num = mysql_fetch_array($query)[0];

echo "<table>\n";
echo "<thead>\n";
echo "<tr>\n";

// вывожу имена категорий в хедер таблицы
for ($i = 1; $i <= $cat_num; $i++) {
$query = mysql_quety("SELECT name_category FROM category WHERE id_category=".$i);
$cat_name = mysql_fetch_array($query)[0];

echo "<th>$cat_name</th>\n";
}

echo "</tr>\n";
echo "</thead>\n";
echo "<tbody>\n";
echo "<tr>\n";

// тут тоже цикл по ценам по каждой категории

echo "</tr>\n";
echo "</tbody>\n";
echo "</table>\n";

Правильно или нет?

Link to comment
Share on other sites

  • 0

На вскидку 3 варианта которые на мой взгляд лучше того что в 6 посте, поехали:


+——--————-+————-————+—————+—————+
| id_category | name_category | price_1 | price_2 |
+————-+—————+———+———+
| 1 | Категория 1 | 10 | 50 |
+————-+—————+———+———+
| 2 | Категория 2 | 30 | 100 |
+————-+—————+———+———+
| 3 | Категория 3 | 25 | 70 |
+————-+—————+———+———+

1


$query = mysql_query("SELECT id_category, name_category, price_1, price_2 FROM category ");
$cat_price = mysql_fetch_array($query);

echo "<tbody>\n";
echo "<tr>\n";

$TheadOut = '';

do {
// цикл по ценам по каждой категории попутно записываем содержимое для thead
$TheadOut .= "<th>$cat_name</th>\n"
// не нравится наращивать строку? тогда пишем все $cat_name в массив в после используя foreach проходим по массиву и выписываем thead
} while( $cat_price = mysql_fetch_array( $cat_price ) );

echo "</tr>\n";
echo "</tbody>\n";

echo "<thead>\n";
echo $TheadOut;
echo "</thead>\n";

echo "<table>\n";

2


$query = mysql_query("SELECT id_category, name_category, price_1, price_2 FROM category ");
$cat_price = mysql_fetch_array($query);

echo "<thead>\n";
echo "<tr>\n";

$TbodyOut = '';

do {
// цикл по именам по каждой категории, попутно записываем содержимое по ценам
$TheadOut .= "<th>$cat_name</th>\n"
// не нравится наращивать строку? тогда пишем все $price_n в массив в после используя foreach проходим по массиву и выписываем tbody
} while( $cat_price = mysql_fetch_array($query) );

echo "</tr>\n";
echo "</thead>\n";

echo "<tbody>\n";
echo $TbodyOut;
echo "</tbody>\n";

echo "<table>\n";

3 берем 2 таблицы из 6 поста


// считаю сколько у меня всего категорий
$query = mysql_query("SELECT name_category FROM category GROUP BY name_category ORDER BY id_category");
$cat_name = mysql_fetch_array($query);

echo "<table>\n";
echo "<thead>\n";
echo "<tr>\n";

// вывожу имена категорий в хедер таблицы
do {
echo "<th>$cat_name</th>\n";
} while( $cat_name = mysql_fetch_array($query) );

echo "</tr>\n";
echo "</thead>\n";

$query = mysql_query("SELECT category_price.price_1, category_price.price_2, category_price.category FROM category_price INNER JOIN category ON category.id_category=category_price.category GROUP BY category.name_category ORDER BY category.category");
$cat_price = mysql_fetch_array($query);

echo "<tbody>\n";
echo "<tr>\n";

// вывожу цены категорий в тело таблицы
do {
echo "<td>$price_1</td>\n";
} while( $cat_price = mysql_fetch_array($query) );

echo "</tr>\n";
echo "</tbody>\n";
echo "</table>\n";

Edited by stars
Link to comment
Share on other sites

  • 0

А зачем 2?

Надо понимать, что если это огромный проект с большущей тучей посетителей, то да надо стремиться делать таблицы максимально упрощенными вплоть до PrimeKey - Value, но если это обычный сайт и в таблице не более 3000 записей не планируется, то нету не чего страшного в том чтобы записать все данные в одну таблицу... Зачем держать 10 таблиц по 100 записей, лучше одну - три с теми же 100 записям, будет выигрыш в выборке за счет отсутствия присоединений и лишний условий(если только там не хранятся огромные куски текста).

Link to comment
Share on other sites

  • 0

Получается только одна таблица нужна, а не две?

да, одна таблица тут, больше не нужно :)

я бы вообще чуточку по-другому бы сделал, без всяких thead, tbody, th...


<table>
<tr>
<td>Наименование категории</td>
<td>цена1</td>
<td>цена2</td>
</tr>
while(...) {
echo '
<tr>
<td>'.$result['name_cat'].'</td>
<td>'.$result['price1'].'</td>
<td>'.$result['price2'].'</td>
</tr>';
}
</table>

Link to comment
Share on other sites

  • 0
Надо понимать, что если это огромный проект с большущей тучей посетителей, то да надо стремиться делать таблицы максимально упрощенными вплоть до PrimeKey - Value, но если это обычный сайт и в таблице не более 3000 записей не планируется, то нету не чего страшного в том чтобы записать все данные в одну таблицу... Зачем держать 10 таблиц по 100 записей, лучше одну - три с теми же 100 записям, будет выигрыш в выборке за счет отсутствия присоединений и лишний условий(если только там не хранятся огромные куски текста).

Нет, это совсем маленький проект. Делаю для знакомых забесплатно, заодно учусь PHP+MySQL на реальном проекте. Будет тупо прайс, который можно заполнять в админке, вывод статей (добавление и удаление из админки) и форма обратной связи (отправить заказ на мыло). Вот и всё.

я бы вообще чуточку по-другому бы сделал, без всяких thead, tbody, th...

Ну мне не хотелось бы, чтоб верстка как-то зависела от данных. Просто у меня практически нет опыта по построению таблиц, запросам и т.п. Последний раз писал что-то на PHP4 в 2006 году, с тех пор уже забыл всё без практики...

Link to comment
Share on other sites

  • 0

Короче я вот так сделал.

Есть таблица (MySQL):


+----------+-------------+---------+---------+
| id_price | cat_name | price_1 | price_2 |
+----------+-------------+---------+---------+
| 1 | Категория 1 | 1000 | 2000 |
+----------+-------------+---------+---------+
| 2 | Категория 2 | 1500 | 2000 |
+----------+-------------+---------+---------+
| 3 | Категория 3 | 1250 | 2500 |
+----------+-------------+---------+---------+

Код PHP:


$query = mysql_query("SELECT cat_name, price_1, price_2 FROM price");

$header = "<thead><tr><th> </th>";
$price_1 = "<tr><td>Цена 1</td>";
$price_2 = "<tr><td>Цена 2</td>";

while ($row = mysql_fetch_array($query)) {
$header .= "<th>$row[0]</th>";
$price_1 .= "<td>$row[1]</td>";
$price_2 .= "<td>$row[2]</td>";
}

$header .= "</tr></thead>";
$price_1 .= "</tr>";
$price_2 .= "</tr>";

$table = "<table cellspacing=\"0\">";
$table .= $header;
$table .= "<tbody>";
$table .= $price_1.$price_2;
$table .= "</tbody>";
$table .= "</table>";

echo $table;

И результат:


+--------+-------------+-------------+-------------+
| | Категория 1 | Категория 2 | Категория 3 |
+--------+-------------+-------------+-------------+
| Цена 1 | 1000 | 1500 | 1250 |
+--------+-------------+-------------+-------------+
| Цена 2 | 1500 | 2000 | 2500 |
+--------+-------------+-------------+-------------+

Как считаете, не сильно криво?

Link to comment
Share on other sites

  • 0

а почему у тебя в: "Цена 2" затесалась не та цена: "1500" на выходе? должно быть вроде как: "2000", не?

чет мне кажется какой-то сумбур-каламбур получился... выводиться как должно? так?


+----------+-------------+---------+---------+
| id_price | cat_name | price_1 | price_2 |
+----------+-------------+---------+---------+
| 1 | Категория 1 | 1000 | 2000 |
+----------+-------------+---------+---------+


+----------+-------------+---------+---------+
| id_price | cat_name | price_1 | price_2 |
+----------+-------------+---------+---------+
| 2 | Категория 2 | 1500 | 2000 |
+----------+-------------+---------+---------+


+----------+-------------+---------+---------+
| id_price | cat_name | price_1 | price_2 |
+----------+-------------+---------+---------+
| 3 | Категория 3 | 1250 | 2500 |
+----------+-------------+---------+---------+

я имею ввиду цены для каждой категории.

Link to comment
Share on other sites

  • 0

А, ну это издержки моей копипасты. На самом деле все ок. Больше интересует насколько такой способ правелен/извратен?

есть небольшой изврат: $row[0], $row[1], $row[2] - тоже издержки копипасты? :)

и еще, все же для четкого понимания не мог бы ты выложить именно html того что получилось?

Link to comment
Share on other sites

  • 0

HTML на выходе:


<table cellspacing="0">
<thead>
<tr>
<th> </th>
<th>Категория 1</th>
<th>Категория 2</th>
<th>Категория 3</th>
</tr>
</thead>
<tbody>
<tr>
<td>Цена 1</td>
<td>1000</td>
<td>1500</td>
<td>1250</td>
</tr>
<tr>
<td>Цена 2</td>
<td>2000</td>
<td>2000</td>
<td>2500</td>
</tr>
</tbody>
</table>

есть небольшой изврат: $row[0], $row[1], $row[2] - тоже издержки копипасты?

А что с этим не так? Первый, второй и третий элемент массива.

Link to comment
Share on other sites

  • 0

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

на счет зависимости верстки от данных, у тебя в таблицы фиксированные поля (название в смысле), то есть, в любом случае если ты добавишь еще одно поле: price3, то тебе так и так придется переписывать код, так что в твоем случае тоже есть зависимость, но твой вариант по моему лучший для подобного тз ;)

UPD: только по мне удобнее все же так:


$query = mysql_query("SELECT * FROM price");
while ($row = mysql_fetch_assoc($query)) {
$header .= "<th>$row['cat_name']</th>";
$price_1 .= "<td>$row['price_1']</td>";
$price_2 .= "<td>$row['price_2']</td>";
}

Link to comment
Share on other sites

  • 0

Да придется переписывать полюбому если вдруг появится price_3, правда я почти уверен что не появится, ведь price_1 - это цена доставки до МКАД, а price_2 - за МКАД. Навряд ли появится еще третья цена.

Ну а допустим если появится, как тогда можно организовать таблицы в БД и вывод инфы? Тогда я вообще слабо представляю...

Link to comment
Share on other sites

  • 0

В первые вижу чтобы цена доставки зависела от категорий. Цена на моей практике зависит от места доставки скажем:

1) Москва в пределах МКАД (200 рублей)

2) Москва и МО за пределами мкад до 80 км (например 200 рублей до 20 км, далее каждый км по 20 рублей)

3) Другие города. (либо лимитированный прайс по городам либо просто выводится информация, что цена согласовывается с мэнаджером)

Далее на доставку может влиять вес:

1) до 3 кг бесплатно

2) от 3 до 10 +100 рублей

3) свыше 10 гк +300 рублей

Возможно габариты, чтобы не парится возьмем водоизмещение:

1) до 10 литров бесплатно

2) от 10 до 50 литров +50 рублей

3) свыше 50 литров +100 рублей

Конечно могут быть различные опции типа наличие грузового лифта и цены за поднятие на этаж(может вы холодильниками торгуете). Цена на доставку рассчитывается так... Скажем везем мы в подмосковье 15км от мкад(яндекс карты помогают определить расстояние) 60 бак весом 8кг, следовательно доставка складывается из доставки по москве + подмосковью считаем:

200 рублей(по москве) + 100 рублей(вес от 3 до 10) +100 рублей(свыше 50 литров) + 200 рублей (за Мкад до 20 км) = 600 рублей...

Если доставка в другой город, то там доставляют транспортные компании и прайс там отдельный...

Таким образом у нас простая таблица

0) id

1) price

2) description

3) group

где id = порядковый номер, price - цена, desctiption - какое-то пояснение(удобно для вывода на странице условий магазина), group - группы на которые я расделил...

Link to comment
Share on other sites

  • 0

Не-не-не, у меня не абстрактный, а совершенно конкретный случай. Цена доставки зависит от категории товара, но есть всего две цены (до МКАД, за МКАД). Количество категорий может меняться, а вот доставка в другие города 90%, что не будет. Конечно всегда остаются эти 10%, поэтому интересно узнать как организовать БД и вывод из нее в этом случае.

А вы уже в дебри полезли :) Никаких пояснений не надо, габариты всегда одинаковы, поэтому вес и прочее не имеет зачения.

Link to comment
Share on other sites

  • 0

Ну а допустим если появится, как тогда можно организовать таблицы в БД и вывод инфы? Тогда я вообще слабо представляю...

да собственно так же: создаешь новое поле в таблице и новую переменную (элемент массива), просто более универсального способа я например не вижу.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy