За последние 24 часа нас посетили 17614 программистов и 1663 робота. Сейчас ищут 945 программистов ...

Интернет-магазин: скидка для пользователей

Тема в разделе "PHP для новичков", создана пользователем Aguero, 10 ноя 2014.

  1. Aguero

    Aguero Новичок

    С нами с:
    14 дек 2013
    Сообщения:
    19
    Симпатии:
    0
    Здравствуйте дорогие форумчане, постараюсь максимально доступно объяснить в чем заключается моя проблема.
    Есть примитивный интернет магазин с 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
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    всё держать в одной таблице, умело различая различные состояния цены. и в заказы не ссылаться на цену а копировать ее. ну чтоб история заказов не поплыла от ввода новой сетки цен.

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

    собственно краткий ответ - рекомендую в одной таблице.
     
  3. Aguero

    Aguero Новичок

    С нами с:
    14 дек 2013
    Сообщения:
    19
    Симпатии:
    0
    Окей, за то что бы держать в одной таблице я тоже думал, но соль моего поста не в этом, мне больше помощь нужна как это все правильно вывести...
    Если это одна таблица то структура в моем понимании должна быть такой:
    id
    uid - id для пользователя, если цена общая для всех то по умолчанию ставиться 0, если цена для юзера то ставиться его id на сайте
    title - название товара
    price - цена товара

    И тогда при заполнении таблице будет что то вроде:
    1 | 0 | Пылесос | 4 рубля
    2 | 0 | Фен | 2 рубля
    3 | 5 | Пылесос | 3 рубля

    Получается что цена пылесоса для всех 4 рубля, а для пользователя с id 5 цена 3 рубля
    Я захожу к нему в профиль, где хочу посмотреть его цены на товар. У меня там должна быть таблица
    2 | Фен | 2 рубля
    3 | Пылесос | 3 рубля - как скрипт должен был понять что из таблицы надо было дернуть именно этот товар для этого пользователя
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Рассказываю, как подобная вещь сделана в VirtueMart. Специальные цены для групп покупателей хранятся в отдельной таблице, и если покупатель из группы, для которой нужна скидка, то цена берётся из этой новой таблице
     
  5. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Я бы тоже держал в двух таблицах - в одной общие цены (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;
     
  6. Aguero

    Aguero Новичок

    С нами с:
    14 дек 2013
    Сообщения:
    19
    Симпатии:
    0
    Вот это по идеи то что мне надо, но не могли бы вы мне разживать ваш sql запрос, потому как до этого я использовал обычные запросы и с таким не сталкивался, не могу его понять((((
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    лучший способ понять запрос — посмотреть как он работает :) выполни его в phpmyadmin или чем ты там пользуешся.

    в этом запросе фишка в LEFT JOIN. результат левого объединения это всё из первой таблицы, плюс те те записи из второй таблицы, для которых выполнилось условие из ON. а когда условие не выполняется, то вместо значений из второй таблицы подставляются NULL.
    Код (Text):
    1. x :               y:
    2. id | a  | b       id | c | d
    3. --------------    ---------------
    4. 1  | 10 | 11      1  |100|111
    5. 2  | 20 | 22      3  |300|333
    6. 3  | 30 | 33
    7. x LEFT JOIN y ON x.id=y.id
    8. id |  a |  b |  c | d
    9. ---------------------------
    10. 1  | 10 | 11 |100 |111
    11. 2  | 20 | 22 |NULL|NULL
    12. 3  | 30 | 33 |300 |333
    я бы так же реализовал задачу — через LEFT JOIN и условную функцию, только есть более подходящие функции: IFNULL() или COALESCE()
    http://dev.mysql.com/doc/refman/5.0/en/comparison-operators ... n_coalesce