2015-12-15 2 views
-1

я пытаюсь получить цену определенной услуги в базе данных MySQL, вычисляется следующим образом:Запрос MySQL, чтобы получить цену от 4 таблицы

У меня есть 4 таблицы:

  • Услуги (idService (INT), ...)
  • Даты (idDate (INT), idService (INT), дата (DATETIME), километры (INT), монтаж (BOOL), ...)
  • Особенности (idFeature (INT), описание (VARCHAR) , цена (FLOAT), ...)
  • Features_Services (idFeature (INT), idService (INT), блоки (INT), скидки (FLOAT), ...)

Отношения:

  • Один ко многим между датами и услуги: Таким образом, услуга может проводиться по нескольким датам, каждый из которых связан со своими километрами (для количественной оценки командировочных расходов, 0,6 евро каждая из них по окончательной цене обслуживания) и монтаж (если не активен в каждую дату, стоимость услуги будет декрементируется на постоянную величину, 100 евро в моем случае) ...

  • Многие ко многим между Особенности и услуги через Features_Services: Таким образом, многие услуги может иметь много связанных функций. Каждая функция имеет единую цену, но и отношение имеет параметры, такие как единицы и скидка ...

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

SELECT 
    CASE 
     WHEN dates.mounting = 0 THEN 
      SUM(features.price * features_services.units * (1 - features_services.discount/100)) + 0.6 * dates.kilometers - 100 
     ELSE 
      SUM(features.price * features_services.units * (1 - features_services.discount/100)) + 0.6 * dates.kilometers 
    END AS servicePrice 

FROM features_services 
JOIN features ON features_services.idFeature = features.idFeature  
JOIN dates ON features_services.idService = dates.idService           
WHERE features_services.idService = XXXXXXX 
GROUP BY dates.idDate LIMIT 1 

проблема заключается в том , что мне нужно перебрать все связанные с ним датами добывающих километров и монтажные и применяя neccesary поправки к цене ... Может быть, с избранным insi de a select, для дат?

Любая помощь очень ценится. Чем вы заранее.

+0

Необычно использовать тип данных FLOAT с деньгами. См. DECIMAL. – Strawberry

ответ

0

Я, наконец, сделал это, используя подзапросы select.Вот решение:

SELECT 
    features_services.idService AS cid, 
    SUM(features.price * features_services.units * (1 - features_services.discount/100)) + 
    (SELECT 0.6 * SUM(dates.kilometers) FROM dates WHERE dates.idService = cid) + 
    (SELECT SUM(CASE when dates.mounting = 1 THEN 0 else -100 END) FROM dates WHERE dates.idService = cid) AS importeTotal 
FROM features_services 
JOIN features ON features_services.idFeature = features.idFeature 
WHERE features_services.idService = XXXXXXXX 

спасибо.