Здравствуйте дорогие форумчане, постараюсь максимально доступно объяснить в чем заключается моя проблема. Есть примитивный интернет магазин с N-м кол-во товара и возможностью регистрации пользователей. Проблема заключается в установлении цены для каждого пользователя отдельно. Сейчас я пытаюсь реализовать следующее: 1) Есть таблица в БД в которой занесено следующее (Название товара, цена товара) 2) Когда заходишь в профиль пользователя там должна выводиться эта таблица a) Если у пользователя еще не было установлена СВОЯ цена на товар, то выводиться общая таблица с ценами для всех б) Если у пользователя была изменена цена на товары, то выводиться таблица с его ценами Проблема моя в том что я не могу реализовать эту "модель". Потому как для меня есть загвоздка в том, что если у пользователя установлена к примеру цена на 1, 3, 4 товар, а на 2 и 5 товар цена осталась стандартной, как правильно вывести таблицу, что бы подхватывались цены и пользовательские и стандартные и куда заносить пользовательские цены, в новую таблицу? Мои мысли, верные они или нет я не знаю, такие вот: 1) Делать две таблице к примеру price1 и price2 в которой будут лежать стандартные цены и цены установленые для пользователей соотвественно. 2) Делать выборку из двух таблиц формирую sql запрос (в нем и состоит проблема, я не знаю как сделать правильную выборку). В таблице price1 у меня лежит id товара, title имя товара и price цена товара В таблице price2 у меня лежит uid - id пользователя для которого установлена своя цена, sid - id товара на который установлена своя цена и price новая цена товара Теперь я так понимаю должен формироваться sql запрос таким образом: делаем выборку из таблицы price1, но если id в price1 = sid в price2, то цену для этого товара мы подхватываем из таблицы price2
всё держать в одной таблице, умело различая различные состояния цены. и в заказы не ссылаться на цену а копировать ее. ну чтоб история заказов не поплыла от ввода новой сетки цен. различные состояния? ну у товара есть некоторая базовая цена на какой-то момент времени. но можно различать опт/розницу, время суток и тому подобное. это вариации базовой цены. далее на товар может быть наложена некоторая акция которая может тоже иметь какую-то логику типа времени проведения, кол-ва товара в остатке и/или кол-ва товара в заказе. эти цены акционные. клиент может иметь какую-то разовую скидку которая может быть выражена чистой ценой или процентной скидкой. относительно какой цены - базовой или акционной - еще одно измерение. и так далее. в итоге мы описываем документально порядок применения ценовых сеток и на выходе получаем по одной цене на каждый товар. это срез цен для пользователя на текущий момент. как-то так примерно. собственно краткий ответ - рекомендую в одной таблице.
Окей, за то что бы держать в одной таблице я тоже думал, но соль моего поста не в этом, мне больше помощь нужна как это все правильно вывести... Если это одна таблица то структура в моем понимании должна быть такой: id uid - id для пользователя, если цена общая для всех то по умолчанию ставиться 0, если цена для юзера то ставиться его id на сайте title - название товара price - цена товара И тогда при заполнении таблице будет что то вроде: 1 | 0 | Пылесос | 4 рубля 2 | 0 | Фен | 2 рубля 3 | 5 | Пылесос | 3 рубля Получается что цена пылесоса для всех 4 рубля, а для пользователя с id 5 цена 3 рубля Я захожу к нему в профиль, где хочу посмотреть его цены на товар. У меня там должна быть таблица 2 | Фен | 2 рубля 3 | Пылесос | 3 рубля - как скрипт должен был понять что из таблицы надо было дернуть именно этот товар для этого пользователя
Рассказываю, как подобная вещь сделана в VirtueMart. Специальные цены для групп покупателей хранятся в отдельной таблице, и если покупатель из группы, для которой нужна скидка, то цена берётся из этой новой таблице
Я бы тоже держал в двух таблицах - в одной общие цены (item_id, price), в другой цены для конкретных пользователей (item_id, user_id, price). И делать примерно так select if (up.price is null; cp.price; up_price) price, cp.item_id from common_prices cp left join user_prices up on cp.item_id = up.item_id where up.user_id = 12345;
Вот это по идеи то что мне надо, но не могли бы вы мне разживать ваш sql запрос, потому как до этого я использовал обычные запросы и с таким не сталкивался, не могу его понять((((
лучший способ понять запрос — посмотреть как он работает выполни его в phpmyadmin или чем ты там пользуешся. в этом запросе фишка в LEFT JOIN. результат левого объединения это всё из первой таблицы, плюс те те записи из второй таблицы, для которых выполнилось условие из ON. а когда условие не выполняется, то вместо значений из второй таблицы подставляются NULL. Код (Text): x : y: id | a | b id | c | d -------------- --------------- 1 | 10 | 11 1 |100|111 2 | 20 | 22 3 |300|333 3 | 30 | 33 x LEFT JOIN y ON x.id=y.id id | a | b | c | d --------------------------- 1 | 10 | 11 |100 |111 2 | 20 | 22 |NULL|NULL 3 | 30 | 33 |300 |333 я бы так же реализовал задачу — через LEFT JOIN и условную функцию, только есть более подходящие функции: IFNULL() или COALESCE() http://dev.mysql.com/doc/refman/5.0/en/comparison-operators ... n_coalesce