Как получить конечную стоимость товара с сезонным столом - PullRequest
0 голосов
/ 04 октября 2018

Как получить окончательную стоимость продукта с таблицей сезонов?

У меня есть эта схема SQL.http://sqlfiddle.com/#!9/79bb30/4/0

, и я использую этот SQL

SELECT *,
       COALESCE(t1.cost, t1.base_price, `ec_products`.`price`) AS final_cost
FROM `ec_products`
LEFT JOIN
  (SELECT ec_season.cost,
          ec_season.base_price,
          ec_season.product_id
   FROM ec_season
   WHERE Duration =
       (SELECT MAX(Duration)
        FROM ec_season
        WHERE `Duration` <= 4 ) ) AS t1 ON `t1`.`product_id` = `ec_products`.`id`

Однако в этом запросе SQL есть ошибка для идентификатора продукта 1. Он дает неправильную цену 30,3.Но должен дать эту цену 40,00.Поскольку MAX (Duration) <= 4 должно быть 2, а цена 40. Можете ли вы помочь мне с этим? </p>

Я тоже пробовал это

SELECT ec_season.cost,
              ec_season.base_price,
              ec_season.product_id
       FROM ec_season
       WHERE Duration =
           (SELECT ec_season.product_id ,  MAX(ec_season.Duration) 
FROM ec_season WHERE `Duration` <= 4 GROUP BY ec_season.product_id)

Но это даетмне эта ошибка

1241 - операнд должен содержать 1 столбец

Пример таблицы сезонов

enter image description here

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Проблема здесь:

   WHERE Duration = (SELECT ec_season.product_id , 
                            MAX(ec_season.Duration) 
                     FROM ec_season
                     WHERE `Duration` <= 4
                     GROUP BY ec_season.product_id
                    )

За = должен следовать скалярный подзапрос.Скалярный подзапрос возвращает один столбец (и не более одной строки).

Предположительно, вы намереваетесь:

 FROM ec_season s
 WHERE s.Duration = (SELECT MAX(s2.Duration) 
                     FROM ec_season s2
                     WHERE s2.Duration <= 4 AND
                           s2.product_id = s.product_id
                    )
0 голосов
/ 04 октября 2018

Вам необходимо сопоставить несколько столбцов product_id и Duration из подзапроса.Это Подзапрос строки ;и MySQL позволяет сопоставлять кортежи.

Попробуйте:

SELECT ec_season.cost,
              ec_season.base_price,
              ec_season.product_id
       FROM ec_season
       WHERE (ec_season.product_id, Duration) =
             (
              SELECT ec_season.product_id, MAX(ec_season.Duration) 
              FROM ec_season 
              WHERE `Duration` <= 4 
              GROUP BY ec_season.product_id
             )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...