Формирование цены

isamitakata
Дата: 12.01.2013 00:52:07
Приветствую, появился вопрос по запросам.

Вот такая ситуация.

Имеется таблица `товары`

в ней находятся такие поля

`тип`,`натуральность`,`цвет`,` страна`

Например:

`тип`,`натуральность`,`цвет`,` страна`

Молоко, Натуральный, Белый, Россия
Молоко, Натуральный, Белый
Хлеб, Натуральный, Черный, Россия
Колбаса, Соя, Красная, Россия
Колбаса, Натуральный, Красная, США

И т.д, вообщем таких записей достаточно и все они разные, молока может быть много с разными данными или каких то данных не хватает, например цвета.

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

И получается у нас вторая табличка , `цены`.

Она хранит в себе такие данные и имеет следующую структуру.

`цены`
`тип`,`натуральность`,`цвет`,` страна`, `цена`

Например:

Молоко, NULL , Белый, NULL , 10
Молоко, Натуральный, Белый, 15
NULL, Натуральный, Черный, NULL, 20
Колбаса, Соя, Красная, Россия, 5
Колбаса, Натуральный, NULL, США, 30
Колбаса, NULL, NULL, Россия, 50
Колбаса, Натуральный, NULL, Россия, 40

Выходит следующее, есть цены для колбасы которая натуральная и из США, ее цена 30, а вот есть просто запись колбаса из России, и для всей колбасы из России нам надо ставить цену 50, или колбаса натуральная из России, то цена 40.

Вообщем вот так, сделать такое ценообразование. Как такое вообще можно реализовать? Помогите люди добрые =)
javajdbc
Дата: 12.01.2013 01:17:33
isamitakata,

что-то типа такого, но проблема что система
не имеет однозначног ответа:

на входе всегда 4 параметра ,
допустим хоть один из нух не null-вой
p_type, p_nat, p_color, p_cntr

select * 
from prices r
where 
        ifnull(r.type ,'same') = ifnull(p_type,  ifnull(r.type,'same'))
and   ifnull(r.nat  ,'same') = ifnull(p_nat,  ifnull(rr.nat,'same'))
and   ifnull(r.color,'same') = ifnull(p_color,  ifnull(r.color,'same'))
and   ifnull(r.cntr ,'same') = ifnull(p_cntr,  ifnull(r.cntr,'same'))


далее могут возникнуть проблемы.
Если на входе Колбаса, просто колбаса --
не понятна чья она -- кремлевская салями или
прошуто котто ? чью цену променить ---
севетские червонцы или итальенскую лиру?

или на входе 3 ненулевых параметра а есть все цены
которые попадают по паре параметров?

(параметры --- тоже что и данные из таблицы товаров,
все выше можно переписать как жоинты...)
miksoft
Дата: 12.01.2013 08:41:47
isamitakata,

задача, видимо, учебная?
иначе структура таблиц никуда не годится....
Arhat109
Дата: 12.01.2013 10:14:23
javajdbc,

да и ваще нипанятна: почто американческая колбаса по 30, а наш - по 40 или 50... дискриминация однако.
isamitakata
Дата: 12.01.2013 11:29:57
Не задача не учебная =) Вообщем пока с ifnull не получается, выводит цену самой первой записи.
qwerty112
Дата: 12.01.2013 13:46:29
isamitakata
Например:

Молоко, NULL , Белый, NULL , 10
Молоко, Натуральный, Белый, 15
NULL, Натуральный, Черный, NULL, 20
Колбаса, Соя, Красная, Россия, 5
Колбаса, Натуральный, NULL, США, 30
Колбаса, NULL, NULL, Россия, 50
Колбаса, Натуральный, NULL, Россия, 40

а вот эта "позиция" в "номенклатуре", что обозначает ? - "негры, в свободной продаже"

вы так "упростили" реальную задачу, что она скатилась в такую бредятину, или так всё и есть "в-сам деле" ?
isamitakata
Дата: 12.01.2013 13:53:52
да насчет этого вы правы) что-то я уже вообще упростил, такого не может быть.
d7i
Дата: 12.01.2013 16:03:21
Я, правда, MySQL совсем не знаю, но практически во всех СУБД есть функция типа
isnull(par1,par2,...), которая может выбирать не-null значение из списка параметров.

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

Кстати...

Для адекватной работы все таблицы должны иметь ключевое поле id (идентификатор типа integer).
Я не рекомендую построения таблиц без этого поля, так как такие таблицы практически
всегда становятся мусором. Использование типа char в качестве идентификационного
поля также не рекомендую.
Ну и т.п. и т.д.

Нужно внимательно изучать основы построения СУБД, и подобные проблемы никогда более
не будут возникать...
javajdbc
Дата: 12.01.2013 17:29:05
qwerty112
isamitakata
Например:

Молоко, NULL , Белый, NULL , 10
Молоко, Натуральный, Белый, 15
NULL, Натуральный, Черный, NULL, 20
Колбаса, Соя, Красная, Россия, 5
Колбаса, Натуральный, NULL, США, 30
Колбаса, NULL, NULL, Россия, 50
Колбаса, Натуральный, NULL, Россия, 40

а вот эта "позиция" в "номенклатуре", что обозначает ? - "негры, в свободной продаже"

вы так "упростили" реальную задачу, что она скатилась в такую бредятину, или так всё и есть "в-сам деле" ?


...в свободной продаже .... :-)


на практике, "нечеткие" (грязнуе, неконсистент) данные встречаются
нередко и не всегда получается немедлено их почистить.
javajdbc
Дата: 12.01.2013 17:33:38
Arhat109
javajdbc,

да и ваще нипанятна: почто американческая колбаса по 30, а наш - по 40 или 50... дискриминация однако.


от как-чесва зависит. В Америке презервативов (в смысле косервантов)
добавят для хранения и перевозки. Хорошие колбасы тут
из Италии...