объединение каждой строки в таблицах

#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. Спасибо за помощь, я ценю это. Да, у меня есть четкое представление о том, как это сделать.