2017-03-19 29 views
-1

我已經有以下查詢:保持SUM但限制選擇

SELECT `c`.`id`, `cake`, `description`, `image`, SUM(`i`.`calories`) AS `calories`, SUM(`i`.`sell_price`) AS `sell_price`, SEC_TO_TIME(SUM(TIME_TO_SEC(`i`.`time`))) as `time`, MIN(`i`.`stock`) AS `stock` 
FROM `cakes` `c` 
LEFT JOIN `recipes` `r` 
    ON `c`.`id` = `r`.`cakes_id` 
LEFT JOIN `ingredients` `i` 
    ON `r`.`ingredients_id` = `i`.`id` 
WHERE `r`.`ingredients_id` = ? 
GROUP BY `c`.`id` 

的表格: 蛋糕:

| id | cake  | description | 
| 1 | chocolate |    | 
| 2 | Example |    | 

方藥:

| id | cake_id | ingredient_id | 
| 1 |  1 |    1 | 
| 2 |  1 |    2 | 
| 3 |  2 |    2 | 

成分:

| id | ingredient | calories | buy_price | sell_price | 
| 1 | Chocolate |  200 |  12.22 |  14.00 | 
| 2 | Sugar  |  300 |  10.50 |  11.50 | 

但是當我運行這個查詢時,所有SUM()都是針對該特定的ingredients_id完成的。

我希望得到的結果是,所有東西仍然會被選中,就像沒有WHERE一樣。但我仍然想獲得其他所有ingredientsSUM()。所以當ingredients_id是1或巧克力,我仍然需要知道卡路里是總共500而不是200。所以基本上選擇cakes,但現在基於蛋糕的成分。

現在我預計輸出爲1, Chocolate, , , 500, 25.50, ,;但不是Example蛋糕只是其中一種成分是巧克力的蛋糕。如果ingredients_id是2,我希望兩個蛋糕都會被退回。

我希望預期的結果足夠清楚,如果不是,請讓我知道。

+0

如果您已經編寫了您的查詢,然後顯示我們或至少您的預期輸出 – Ravi

+0

編輯您的問題並顯示您想要的結果。如果您刪除了所有反引號,您的查詢也會更容易閱讀。 –

回答

2

我很漂亮,你想要的是有條件的聚合。我只是不能說出你想要的領域。也許:

SELECT c.id, c.cake, c.description, c.image, 
     SUM(`i`.`calories`) AS `calories`, 
     SUM(CASE WHEN `r`.`ingredients_id` = ? THEN `i`.`sell_price` END) AS ingredient_sell_price, 
     SEC_TO_TIME(SUM(TIME_TO_SEC(`i`.`time`))) as `time`, 
     MIN(CASE WHEN `r`.`ingredients_id` = ? THEN `i`.`stock` END) AS ingredient_stock 
FROM cakes c LEFT JOIN 
    recipes r 
    ON c.i` = r.cakes_id LEFT JOIN 
    ingredients i 
    ON r.ingredients_id = i.id 
GROUP BY c.id; 

編輯:

如果你只是想有巧克力蛋糕,那麼你會看的成分後做了彙總:

SELECT c.id, c.cake, c.description, c.image, 
     SUM(i.calories) AS calories, 
     SUM(i.sell_price) AS ingredient_sell_price, 
     SEC_TO_TIME(SUM(TIME_TO_SEC(i.time))) as `time`, 
     MIN(i.stock) AS ingredient_stock 
FROM cakes c LEFT JOIN 
    recipes r 
    ON c.i` = r.cakes_id LEFT JOIN 
    ingredients i 
    ON r.ingredients_id = i.id 
GROUP BY c.id 
HAVING SUM(r.ingredients_id = ?) > 0; 

這將返回唯一蛋糕有你想要的特定成分。

+0

我已經更新了關於預期結果的更多細節問題 – SuperDJ

+0

已經過測試,但它沒有給我預期的結果 – SuperDJ