#mysql #sql
#mysql #sql
Вопрос:
Я действительно не знаю, каким должен быть заголовок, но я постараюсь объяснить это как можно более четко.
У меня есть онлайн-портал о еде, который включает в себя различные виды продуктов.В зависимости от еды я характеризую разные атрибуты для разных блюд. Для простоты предположим, что я продаю торты и обертки.Торты могут иметь следующие атрибуты, т.е. Они имеют вес, и в зависимости от веса их цены меняются.
Аналогично, обертки могут иметь два атрибута, они могут быть большими и маленькими.
base_product_table
ID | product_code | product name | company_id
1 | 12345 | beer cake |343434defee
2 | 12346 | vodka cake |343434deereee
3 | 123451 | cheese wrap |wqeqwewwe
4 | 123453 | nb wrap |weqwew
5 | 123464 | ad wrap | adwadw
cake_table
Product_code |Quantity | price | weight
12345 | 34 |345 |0.5
12345 | 343 |600 |1.0
12345 | 4 |845 |1.5
12346 | 341 |345 |0.5
wraps_table
Product_code |Quantity | price | size
123451 | 34 |345 |s
123451 | 343 |600 |l
123453 | 4 |845 |s
123464 | 341 |345 |s
Это мои три таблицы, одна из которых является базовой таблицей, а две другие можно объединить с базовой таблицей, чтобы получить нужную таблицу.
Реальная проблема с этим методом возникает, когда мне приходится отображать каждый продукт на странице моих продуктов.Я мог бы просто сделать select * from base_product_table
, но мне нужно отобразить цену продукта с указанием веса или размера продукта, если таковой имеется.
Приведенное выше изображение показывает, что я имел в виду, отображая продукты на странице продукта.
Как я могу достичь своего решения?
Обновление: в таблице cake у меня есть cake, но с тремя разными весами, тогда результат должен быть только один для соответствующего cake с весом, равным наименьшему весу, и ценой этого наименьшего веса.
Аналогично, wraps имеет два размера Small и large , вывод будет только один для этого wrap с меньшей ценой записи.
Комментарии:
1. Либо объедините базовую таблицу product с объединением двух других таблиц, либо объедините ее с каждой из других таблиц и создайте их объединение.
2. Не могли бы вы, пожалуйста, написать ответ на это? я буду признателен. @Barmar
3. Я вижу проблему, вы хотите показать продукт только один раз, но у вас может быть 1 или более цен, в зависимости от доступных размеров, правильно?
4. Для
product_code
123451 вы хотите иметь одну запись в выходных данных с разными наборами столбцов для больших и малых размеров или вам нужны две записи?5. @RobertoNavarro Да, точно.
Ответ №1:
Этот SQL возвращает цену за пирожные, предполагая, что вы хотите цену за наименьшее (по весу).
SELECT pt.product_name,
pt.company_id,
(SELECT MIN (price)
FROM cake_table ct
WHERE ct.product_code = pt.product_code
AND ct.weight = (SELECT MIN (sub.weight)
FROM cake_table sub
WHERE sub.product_code = ct.product_code))
cake_price
FROM base_product_table pt
Если это работает, то, как предлагалось ранее, нужно просто объединить две таблицы:
( (SELECT pt.product_name,
pt.company_id,
(SELECT MIN (price)
FROM cake_table ct
WHERE ct.product_code = pt.product_code
AND ct.weight = (SELECT MIN (sub.weight)
FROM cake_table sub
WHERE sub.product_code = ct.product_code))
cake_price
FROM base_product_table pt
WHERE EXISTS
(SELECT 'X'
FROM cake_table ck
WHERE ck.product_code = pt.product_code))
UNION ALL
(SELECT pt.product_name,
pt.company_id,
(SELECT MIN (price)
FROM wraps_table ct
WHERE ct.product_code = pt.product_code
AND ct.weight = (SELECT MIN (sub.weight)
FROM wraps_table sub
WHERE sub.product_code = ct.product_code))
cake_price
FROM base_product_table pt
WHERE EXISTS
(SELECT 'X'
FROM wraps_table ck
WHERE ck.product_code = pt.product_code)))
Комментарии:
1. Спасибо за помощь, я ценю это
2. Это то, что вы искали? Кроме того, возвращает ли он полу-ожидаемые результаты? Я должен добавить, что дизайн БД немного странный, я бы создал единую таблицу продуктов с обертками / тортами и т. Д. В качестве атрибутов элемента… затем вы можете иметь под рукой таблицу количества, которая представляет ваши подсчеты и затраты. Наличие таблицы для каждого типа не очень хороший дизайн БД: (
3. Роберто, каким будет ваш дизайн? не могли бы вы объяснить это немного подробнее? я мог бы использовать этот дизайн. Мне тоже не нравится этот дизайн. Я не мог придумать более сложный дизайн.
4. На высоком уровне отбросьте таблицы cake / wrap и добавьте столбец в вашу базовую таблицу product_table … т.е.. product_type. Затем создайте другую таблицу для хранения ваших типов продуктов для обеспечения целостности данных. Видите, к чему я клоню? Затем создайте таблицу, в которой вы храните свои исходные количества, скажем, item_onhand , и каждая строка в этой таблице будет иметь product_code в качестве FK …
5. я понял до конца, добавив столбец, но что вы подразумеваете под количествами oh? Не могли бы вы изобразительно представить это где-нибудь? Достаточно примера.
Ответ №2:
Я надеюсь, вам нужен вывод, подобный приведенному ниже запросу. Предполагая, что вес и размер имеют одинаковый тип данных, в противном случае используйте приведение для возврата одного и того же типа даты из обоих результатов объединения.
select product_name,price,weight as custom
from base_product_table bpt join cake_table ct on bpt.product_code = ct.product_code where weight = (select min(weight) from cake_table ct2 where ct.product_code = ct2.product_code)
union all
select product_name,price, size as custom
from base_product_table bp join wrap_table wt on bp.product_code = wt.product_code where size = (select min(size) from wrap_table w2 where wt.product_code = w2.product_code);
Комментарии:
1. пользовательский столбец для размеров появляется пустым? может быть, они разных типов?
2. Это может быть. пожалуйста, измените запрос и используйте приведение для преобразования в общий тип. Другие столбцы заполнены правильно?
3. Спасибо за помощь, я ценю это. Да, у меня есть четкое представление о том, как это сделать.