2014-12-26 38 views
0

我有幾個表加入MySQL - 一個有很多其他人。 嘗試從其中一個項目中選擇項目,按另一個表格中的最小值排序。錯誤的組合和按合併順序

不進行分組中好像是這樣的:

代碼:

select `catalog_products`.id 
    , `catalog_products`.alias 
    , `tmpKits`.`minPrice` 
from `catalog_products` 
left join `product_kits` on `product_kits`.`product_id` = `catalog_products`.`id` 
left join (
    SELECT MIN(new_price) AS minPrice, id FROM product_kits GROUP BY id 
) AS tmpKits on `tmpKits`.`id` = `product_kits`.`id` 
where `category_id` in ('62') 
order by product_kits.new_price ASC 

結果:

enter image description here


但磨片n個I通過添加組,我得到這個:

代碼:

select `catalog_products`.id 
    , `catalog_products`.alias 
    , `tmpKits`.`minPrice` 
from `catalog_products` 
left join `product_kits` on `product_kits`.`product_id` = `catalog_products`.`id` 
left join (
    SELECT MIN(new_price) AS minPrice, id FROM product_kits GROUP BY id 
) AS tmpKits on `tmpKits`.`id` = `product_kits`.`id` 
where `category_id` in ('62') 
group by `catalog_products`.`id` 
order by product_kits.new_price ASC 

結果:

enter image description here

而這是不正確的排序!

不知何故,當我分組這個結果,我得到ID 280之前!

但我需要得到:

281 | 1600.00

280 | 2340.00

因此,分組休息現有訂貨!

+0

我需要他們按最低價格排序。並對它們進行排序。 但集團正在打破這種排序。 – violarium

+0

group by catalog_products.id'將只返回每個id的一行,如果你想要顯示所有的行,那麼不要使用group by catalog_products.id,product_kits.new_price' –

+0

如果你喜歡,考慮遵循以下簡單的兩步操作步驟:1.如果您尚未這樣做,請提供適當的DDL(和/或sqlfiddle),以便我們可以更輕鬆地複製問題。 2.如果您尚未這樣做,請提供與步驟1中提供的信息相對應的所需結果集。 – Strawberry

回答

0

的事情是,通過組不通過MySQL的認識秩序。

其實,我所做的實際上是不好的做法。 在這種情況下,您應該使用distinct和catalog_products。*

在我看來,group by在您需要聚合函數的組結果時非常有用。否則你不應該用它來獲得唯一的值。

0

其中之一,當您將GROUP BY僅應用於一列時,不能保證其他列中的值始終正確。不幸的是,MySQL允許這種類型的SELECT/GROUPing發生其他產品沒有的。二,在MySQL允許的子查詢中使用ORDER BY的語法不允許在其他數據庫產品(包括SQL Server)中使用。您應該使用一種解決方案,每次執行時都會返回正確的結果。

所以查詢將是:

其一,當你申請的GROUP BY只有一列,也不能保證,在其他列中的值將始終是正確的。不幸的是,MySQL允許這種類型的SELECT/GROUPing發生其他產品沒有的。二,在MySQL允許的子查詢中使用ORDER BY的語法不允許在其他數據庫產品(包括SQL Server)中使用。您應該使用一種解決方案,每次執行時都會返回正確的結果。

所以查詢將是:

select CP.`id`, CP.`alias`, TK.`minPrice` 
    from catalog_products CP 
    left join `product_kits` PK on PK.`product_id` = CP.`id` 
    left join (
     SELECT MIN(`new_price`) AS "minPrice", `id` FROM product_kits GROUP BY `id` 
    ) AS TK on TK.`id` = PK.`id` 
    where CP.`category_id` IN ('62') 
    order by PK.`new_price` ASC 
    group by CP.`id` 
+0

你是否在'group by'之前開玩笑'order by'子句,你添加了'order by product_kits.new_price ASC group by catalog_products.id' –