- История на поръчките
1234
WT форуми -> PHP MySQL ASP.NET -> История на поръчките
Създайте нова тема Напишете отговор 
Автор Съобщение
mapka7a
Турист
Турист

Регистриран на: 05/09/2011 11:21 am

Support: 20
Bonus: 38
Мнения: 242
Мнение 21/08/2017 2:03 pm      Отговорете с цитат


Много офф много нещо ...
както и да е,
@teroristdмисля че в случая че ти трябва фукция като group_concat за продукти цени и прочие, селектваш по email и групираш по order_id


SELECT GROUP_CONCAT(product) as order_product, GROUP_CONCAT(price) as order_price FROM orders WHERE email="neshoto@si.bg" GROUP BY order_id


Това е спрямо таблицата която си дал. Ако имаш поле за дата може да ги сортираш по нея
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
Revelation
Турист
Турист

Регистриран на: 24/03/2013 3:23 pm

Support: 39
Bonus: 78
Мнения: 559
Мнение 21/08/2017 2:22 pm      Отговорете с цитат


Принципно структурата ти не е добра, ама въобще. Но така си избрал, твое решение.
Заявката, която даде @mapka7a ще работи за твоя случай, само трябва да си я обработиш при извикване.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
ttta
Нов
Нов

Регистриран на: 11/08/2017 9:41 am

Support: 0
Bonus: 0
Мнения: 14
Мнение 21/08/2017 2:39 pm      Отговорете с цитат


Превръщаш данни в стринг след това го сплитваш отново към данните от които си го съставил.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
Revelation
Турист
Турист

Регистриран на: 24/03/2013 3:23 pm

Support: 39
Bonus: 78
Мнения: 559
Мнение 21/08/2017 2:56 pm      Отговорете с цитат


ttta написа:

Превръщаш данни в стринг след това го сплитваш отново към данните от които си го съставил.


Другият вариант, който аз предпочитам е, да си извлека всички ордери за конкретния потребител и при въртенето на цикъла да ги разделям.

PHP code:

$sth = $dbh->query("SELECT * FROM orders WHERE email='ivan@abv.bg' ORDER BY order_id");
$result = $sth->fetchAll(PDO::FETCH_ASSOC);

echo "<pre>";
$i = 1;
$lastId = 0;
foreach ( $result as $row ) {
if ($row['order_id'] > $lastId ) {
echo "Поръчка #" . $i . PHP_EOL;
$lastId = $row['order_id'];
$i++;
}
echo "\t Предмет: " . $row['product'] . PHP_EOL;
}
echo "</pre>";


Резултат:
PHP code:

Поръчка #1
Предмет: дънки
Предмет: блуза
Поръчка #2
Предмет: яке
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
mapka7a
Турист
Турист

Регистриран на: 05/09/2011 11:21 am

Support: 20
Bonus: 38
Мнения: 242
Мнение 21/08/2017 3:12 pm      Отговорете с цитат


Решението е спрямо това което е дал, като структура
Ако иска да преправи решението/структура, нека пусне нова тема за кодревю и ше му се даде по-адекватно решение ....
Съжелявам за оффтопика
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
novakabg
Турист
Турист

Регистриран на: 13/05/2016 2:29 pm

Support: 5
Bonus: 10
Мнения: 222
Мнение 21/08/2017 5:59 pm      Отговорете с цитат


Значи искаш да направиш история на поръчки Smile.
Гледам искаш да изкараш:Име на човека,име на продукта,опция на продукта(цвят или размер),цена.


Това са няколко заявки не е само една.
Първо да е всичко читаво трябва да имаш таблица за потребител където при заявка да се вписва това ще е само при регистрирани потребители няма как да стане при гости нали знаеш.
Представи си че след време искаш да излизат в админ панел тези неща и да филтрираш и тем-подобни Very Happy.


Ето ти един пример как аз направих но това е за сериозен проект и е MVC.

Таблици:
order
order_product
order_option
order_status
order_total


order - държа имената на клиента,email,телефон,адрес,инфо за фактура.

order_product
- име,цена,модел...

order_option- тука държа какво е избрал като цвят и опция и цената на опцията и още неща за опцията която е избрал даден клиент.

Малко става сложно но ако искаш за напред всичко да е окей и да нямаш проблеми така се прави, пробвал съм по твоят начин и после става лошо.

После заявките са ти така.

Вземи продукт:

$query("SELECT * FROM order_product WHERE order_id = '" . (int)$order_id . "' AND order_product_id = '" . (int)$order_product_id . "'");

Вземи опции:
$query("SELECT * FROM order_option WHERE order_id = '" . (int)$order_id . "' AND order_product_id = '" . (int)$order_product_id . "'");


А ако вече имаш таблица и искаш директно от поръчките да изкараш, правиш по User ID търсиш поръчката и по числа, ама след време ще си имаш големи проблеми, php не е много бързо.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
raiden
Активен
Активен

Регистриран на: 08/12/2006 10:13 am

Support: 181
Bonus: 448
Мнения: 2136
Мнение 21/08/2017 6:33 pm      Отговорете с цитат


@teroristd, мисля че наистина трябва да обмислиш промяна на структурата. Тази таблица противоречи на основни правила в релационните БД.
Относно резултата, който се опитваш да постигнеш - общата практика е да се използват 2 заявки - 1 за поръчките и 1 за продуктите. За да постигнем по-добра производителност на работа правим магии с JSON, но използваме PostgreSQL. Направил съм ти пример с MySQL (v8.0), нямам наблюдения над производителността на JSON функциите там, но целта е да добиеш представа как става с 1 заявка и сам да се убедиш, че имаш нужда от по-добра структура на данните:
https://www.db-fiddle.com/f/35bEH7zoCenrs8ZKtXM3YQ/1

В php можеш да направиш json_decode на колоната с продуктите и да получиш масив от обекти, като всеки обект ти е продукт в поръчката. Ако ти трябва помощ съм насреща.
А ето и няколко въпроса на които отговорите трябва да те наведат на мисълта за промяна структурата:
Как ще направиш групиране по продукти?
Как ще записваш и извеждаш по няколко поръчани бройки от 1 и същ продукт?
Как ще реализираш функция "повтори поръчката"? А при променена цена? А с проверка за наличност?
От къде ще дойде информацията за тези продукти? Вероятно имаш таблица с продукти - използвай я.

ПС: Мисля, че ще ти е много полезно да прочетеш нещо кратко (5-10мин) с примери за нормализация на БД (1,2,3-то ниво) и да се опиташ да си нормализираш таблицата.
След това можеш да разгледаш базата данни Northwind (google it) и да почерпиш вдъхновение Very Happy

Последната промяна е направена от raiden на 21/08/2017 6:50 pm; мнението е било променяно общо 1 път
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Турист
Турист

Регистриран на: 24/03/2013 3:23 pm

Support: 39
Bonus: 78
Мнения: 559
Мнение 21/08/2017 6:43 pm      Отговорете с цитат


Безсмислени гимнастики. Дори при разделяне на структурата си му е нужна 1 заявка. Логиката не е трудно да се направи с PHP.

@raiden, примера ти е добър, но не съм сигурен колко хостинг компании поддържат 8 версия на MySQL.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
raiden
Активен
Активен

Регистриран на: 08/12/2006 10:13 am

Support: 181
Bonus: 448
Мнения: 2136
Мнение 21/08/2017 8:07 pm      Отговорете с цитат


@Relevation, не знам как стои въпроса с поддръжката, от няколко години работя с PostgreSQL, а исках да покажа възможно решение и видях, че в нея вече има такива функции (между другото WITH ... AS ... също се въвежда с 8 версия). Иначе вероятно масово се ползва 5.1.73 като най-зряла и надеждна. А примера ми цели именно да го откаже от подобни гимнастики и да го насочи в "правия път" (нормализация) Wink. Подобни структури не трябва да се използват в общи случаи, а само когато други фактори, неподлежащи на промяна, го налагат. Но тук търсим конкретно решение на конкретен проблем.
Относно логиката в PHP - да, сортиране и следене за промяна е ОК и кода ти го демонстрира много добре, същият подход се използва за групиране и калкулиране на sub(totals) в Excel.
Отидохме много offtopic, @teroristd ако имаш желание да научиш повече за това как се подхожда при създаване на структурата на данните в релационна БД можеш да ми пишеш съобщение, ще ти пратя материали за четене.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Турист
Турист

Регистриран на: 24/03/2013 3:23 pm

Support: 39
Bonus: 78
Мнения: 559
Мнение 22/08/2017 12:20 am      Отговорете с цитат


PHP code:

$lastId = $result[0]['order_id']-1;
foreach ( $result as $row ) {
if ($row['order_id'] > $lastId ) {
echo "Поръчка #" . ($lastId+1) . PHP_EOL;
$lastId = $row['order_id'];
} else if ( $row['order_id'] < $lastId ) {
echo "Поръчка #" . ($lastId-1) . PHP_EOL;
$lastId = $row['order_id'];
}
echo "\t Предмет: " . $row['product'] . PHP_EOL;
}


Малко промяна, за да работи във възходящ и низходящ ред.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 80
Bonus: 172
Мнения: 1561
Мнение 22/08/2017 3:00 pm      Отговорете с цитат


Revelation написа:
ttta написа:

Превръщаш данни в стринг след това го сплитваш отново към данните от които си го съставил.


Другият вариант, който аз предпочитам е, да си извлека всички ордери за конкретния потребител и при въртенето на цикъла да ги разделям.

PHP code:

$sth = $dbh->query("SELECT * FROM orders WHERE email='ivan@abv.bg' ORDER BY order_id");
$result = $sth->fetchAll(PDO::FETCH_ASSOC);

echo "<pre>";
$i = 1;
$lastId = 0;
foreach ( $result as $row ) {
if ($row['order_id'] > $lastId ) {
echo "Поръчка #" . $i . PHP_EOL;
$lastId = $row['order_id'];
$i++;
}
echo "\t Предмет: " . $row['product'] . PHP_EOL;
}
echo "</pre>";


Резултат:
PHP code:

Поръчка #1
Предмет: дънки
Предмет: блуза
Поръчка #2
Предмет: яке


Благодаря за отговорите. За сега ще се съсредоточа върху решението на @Revelation, което работи както се очаква.

Искам да направя същото нещо и в администраторската част, но с тази разлика че трябва да се изведат поръчките на всички потребители. Един вид потребител Иван - поръчките, потребител Петкан - поръчките.

Как ще стане?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Турист
Турист

Регистриран на: 24/03/2013 3:23 pm

Support: 39
Bonus: 78
Мнения: 559
Мнение 22/08/2017 4:51 pm      Отговорете с цитат


Най-лесно може да стане, като си извеждаш списък с потребителите. И при избиране на определен потребител да вадиш данните само за него по същия начин.
Не мисля, че е добра идея да вадиш абсолютно всички поръчки, на всички потребители, на един път.


П.П.

Иначе идеята е подобна:

PHP code:

$lastId = $result[0]['order_id']-1;
$lastUser = "";
foreach ( $result as $row ) {
if ( $row['name'] != $lastUser ) {
printf("%s\n", $row['name']);
$lastUser = $row['name'];
}
if ($row['order_id'] > $lastId ) {
printf("\tПоръчка #%d\n", ($lastId+1));
$lastId = $row['order_id'];
} else if ( $row['order_id'] < $lastId ) {
printf("\tПоръчка #%d\n", ($lastId-1));
$lastId = $row['order_id'];
}
printf("\t\tПредмет: %s\n", $row['product']);
}

Като махаш WHERE клаузата от заявката.

И ето защо не е хубаво да пазиш имената на потребителите, а ID от друга таблица. С числа се работи по-лесно и в бъдеще промените стават доста по-удобни и по-лесни.

Резултат:
PHP code:

Иван
Поръчка #1
Предмет: дънки
Предмет: блуза
Поръчка #2
Предмет: яке
Поръчка #3
Предмет: жилетка
Петкан
Поръчка #4
Предмет: блуза
Предмет: риза


Последната промяна е направена от Revelation на 22/08/2017 5:02 pm; мнението е било променяно общо 2 пъти
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Покажи мнения от преди:    
Създайте нова тема   Напишете отговор    web-tourist.net Форуми -> PHP MySQL ASP.NET Часовете са според зоната GMT + 2 Часа
1234
Страница 2 от 4


 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети