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

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

Support: 80
Bonus: 172
Мнения: 1561
Мнение 24/08/2017 9:20 am     История на поръчките част 2 Отговорете с цитат


Здравейте, това е продължение на предишната тема.
@raiden беше така добър да предложи помощта си, за правилното изграждане на базата и реализацията на задачката.

Първо ще обясня какво точно искам да постигна, и след това ще пусна sql-a. Задачката се състои от две части.

Първа и по-важна част е администраторската.
Искам администратора да вижда всички направени поръчки, като всяка поръчка трябва да съдържа цялата информация за нея. Например снимка на предмета, цена, адрес за доставка и т.н. Ако поръчката съдържа повече от един предмет, съответно да излизат един под друг и да се смята обща цена. Всяка една поръчка да има статус, например за нова поръчка - обработва се, когато бъде изпратена - изпратена и накрая приключена. Това трябва да се прави от администратора, може би чрез някакви бутони към самата поръчка. В таблиците още не съм сложил полета за статусите. Принципно е добре да може поръчките да се визуализират по статуса. Нови, изпратени и приключени. Мисля че не е зле и да може да се изтриват.

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

Пускам таблиците, като особеното е че съм ги разделил в три бази данни. Едната няма общо с поръчките и може да се игнорира, но ще я пусна все пак да я има. Базата в която сe добавят предметите се казва admin, а таблицата offer.

Последната промяна е направена от teroristd на 13/09/2017 12:52 pm; мнението е било променяно общо 1 път
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
uphero
Потребител
Потребител

Регистриран на: 20/02/2012 2:26 pm

Support: 31
Bonus: 62
Мнения: 690
Мнение 24/08/2017 4:29 pm      Отговорете с цитат


Защо в orders има поле order_id?

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

Регистриран на: 11/06/2012 8:07 pm

Support: 140
Bonus: 279
Мнения: 1307
Мнение 24/08/2017 4:43 pm      Отговорете с цитат


uphero написа:
Защо в orders има поле order_id?

В тази таблица трябва да има само ид на потребителя + продуктите.

Да. Като за начало може да махне цялата потребителска информация от orders и да държи само id-то на юзера, откъдето ще може да си извади допълнителни детайли:
SQL code:

CREATE TABLE `orders` (
`id` int(11) NOT NULL,
`first_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, -- Тук
`last_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, -- Тук
`email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, -- Тук
`image` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`sizes` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`counter` int(11) DEFAULT NULL,
`quantity` int(11) DEFAULT NULL,
`price` double DEFAULT NULL,
`address` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, -- Тук
`phone` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, -- Тук, и надолу ако има също
`sku` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`invoice` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`order_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

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

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

Support: 5
Bonus: 10
Мнения: 221
Мнение 04/09/2017 5:58 pm      Отговорете с цитат


Аз не разбрах код ли искаш или структура?


Аз по код не ме бива много, ето ти линк за структура правилна Smile

https://pastebin.com/xkG7u5A4
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

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

Support: 80
Bonus: 172
Мнения: 1561
Мнение 09/09/2017 8:18 am      Отговорете с цитат


Най-лесно е да премахна всичко от orders и да оставя само email примерно, който е уникален за всеки юзър. Въпросът е каква трябва да е заявката/заявките?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

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

Support: 80
Bonus: 172
Мнения: 1561
Мнение 13/09/2017 12:54 pm      Отговорете с цитат


Явно @raiden няма да предложи решение. Може да заключите темата.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
novakabg
Турист
Турист

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

Support: 5
Bonus: 10
Мнения: 221
Мнение 14/09/2017 7:48 pm      Отговорете с цитат


Не знам колко голям ще ти стане проекта, но ако трябва да правиш някакви events календари и статистики или пък клиента да не иска да има задължителен email при поръчка или има бърза поръчка само по телефон и име и адрес какво правим.
Според мен е редно да се помисли за напред какво може да се изисква от проекта, защото ако излезе нещо и систематати не е измислена добре като структура....или греша?!
Ще се радвам да ме поправите защото още се уча на тези неща.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
raiden
Активен
Активен

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

Support: 181
Bonus: 448
Мнения: 2136
Мнение 14/09/2017 10:56 pm      Отговорете с цитат


@teroristd съжалявам че се изгубих така и те оставих да висиш но нямам много време напоследък.

Направо по същество, като за начало orders съдържа данни от 3 таблици и трябва да се заменят с външни ключове.
Първо можеш да си направиш 1 таблица за поръчки с полета за клиент, датата на поръчката и например статуса
SQL code:
CREATE TABLE `orders_new`(
id int primary key auto_increment,
user_id int not null,
date_added timestamp default current_timestamp
);
INSERT INTO `orders_new`
select
distinct(o.order_id), u.id as user_id, null
from orders o
left join users u
on o.email = u.email;

orders_new: id INT, user_id INT, date_added TIMESTAMP ...

После трябва да направиш свързваща таблица между поръчките и продуктите
В момента нямаш поле което да идентифицира продукта така че ще ползвам картинката+цената
SQL code:
CREATE TABLE `orders-products`(
order_id int not null,
product_id int not null,
quantity int not null default 1,
price float(8,2) not null,
sizes varchar(60)
);
INSERT INTO `orders-products`
select
o.order_id, p.id as product_id, o.quantity, o.price, o.sizes as option
from orders o
left join offer p
on o.image = p.image and
o.price = p.price;

orders-products: order_id INT, product_id INT, quantity INT, price FLOAT, option VARCHAR
Тук предполагам че логиката ти за размерите е в кода, макар че е добре ако имаш различни варианти на 1 и същ продукт да създадеш 2 нови таблици - 1 за видовете опции (размер, цвят и т.н.) и една която да свърза даден продукт с определени опции. Ако решиш да го правиш трябва да се вземат предвид групи опции (синя S и L, червена M и L) за които е добре да се направят още 2 отделни таблици.

Таблицата в която съхраняваш картинките към определен продукт има колона image_id, а до колкото виждам отговаря на offer.id, така че преименувай я да не те бърка. Полето offer.image можеш да го махнеш.

Съжалявам отново че нямам достатъчно време да продължа темата.
Oпитай се сам да изкараш категориите, размерите и цветовете в отделни таблици. Основното което трябва да знаеш са два типа връзки
1 към много - пример за това е връзката между таблиците offer и offer_images.
Имаш 1 продукт с много картинки, но 1 картинка е само за 1 продукт. Връзката се реализира като в таблицата с "многото" се включи колона (външен ключ) която посочва "едното". В твоя случай offer_images.image_id сочи към offer.id и посочва за кой продукт е картинката.
много към много - пример е връзката между offers и orders. 1 продукт може да участва в много поръчки и в 1 поръчка може да има много продукти. Реализира се с нова свързваща таблица (orders-products). Включват се външни ключове към първичните ключове на двете таблици (order_id->orders.id, product_id->offer.id). Двата атрибута могат да се използват като съставен първичен ключ или да се създаде нов.
Ето и за финал заявка която да сглоби ненормализираната таблица от новите:
SQL code:
select
u.first_name,
u.last_name,
u.email,
img.image,
op.sizes,
op.quantity,
op.price,
u.address,
u.phone,
p.sku,
o.id
from orders_new o
join users u on o.user_id = u.id
join `orders-products` op on o.id = op.order_id
join offer p on op.product_id = p.id
join (select image_id, max(image) as image from offer_images group by image_id) img on p.id = img.image_id

Ползвам агрегатна функция, за да взема само 1 от няколкото картинки, така че може да се различава от оригиналната.
Ще се опитам да следя темата, ако имаш въпроси питай
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Покажи мнения от преди:    
Създайте нова тема   Напишете отговор    web-tourist.net Форуми -> PHP MySQL ASP.NET Часовете са според зоната GMT + 2 Часа
Страница 1 от 1


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