2013-08-03 72 views
-1

我需要執行排序之前 GROUP BY子句,但MySQL不想合作。GROUP BY之前排序 - 不工作

SELECT `article`, `date`, `aip` 
FROM `official_prices` 
WHERE `article` = 2003 
GROUP BY `article` 
ORDER BY `date` ASC 

應該挑選該行是一個從最早的日期(2013年7月15日),而是它選擇在首先出現在表順序的日期。更改爲DESC沒有區別。

第一張圖像顯示兩行,未分組。第二個圖像是他們被分組。

enter image description here

此表是由一個主查詢,所以(我認爲)涉及LIMIT 1任何解決方案將不會是對我有用的接合。

全面查詢:

SELECT `articles`.*, `official_prices`.`aip` 
FROM `articles` 
LEFT JOIN `official_prices` 
ON (`official_prices`.`article` = `articles`.`id`) 
GROUP BY `articles`.`id`, `official_prices`.`article` 
ORDER BY `official_prices`.`date` ASC, `articles`.`name` 

回答

1

你所要做的僅僅是不正確。 group by之前的排序對結果沒有(保證)影響。

我的猜測是,您希望獲取該日期的最新dateaip。這裏是一個更好的方法:

SELECT `article`, max(`date`), 
     substring_index(group_concat(`aip` order by date desc), ',', 1) as lastAip 
FROM `official_prices` 
WHERE `article` = 2003 
GROUP BY `article`; 

唯一的缺點是,group_concat()將任何值轉換爲字符串。如果它是某種其他類型(並且字符串帶來問題),則將其轉換回所需的類型。

其實,一個更好的辦法是跳過group by完全,因爲你已經篩選到一個文章:

select article, `date`, aip 
from official_prices 
where article = 2003 
order by `date` desc 
limit 1; 

第一種方法適用於多種物品。

編輯:

完整的查詢內容是:

SELECT `articles`.*, `official_prices`.`aip` 
FROM `articles` LEFT JOIN 
    `official_prices` 
    ON `official_prices`.`article` = `articles`.`id` 
GROUP BY `articles`.`id`, `official_prices`.`article` 
ORDER BY `official_prices`.`date` ASC, `articles`.`name`; 

您正在尋找一個以上的文章,所以第二種方法是行不通的。因此,使用第:

SELECT `articles`.*, 
     substring_index(group_concat(`official_prices`.`aip` order by `official_prices`.`date` desc), 
         ',', 1) as lastAIP 
FROM `articles` LEFT JOIN 
    `official_prices` 
    ON `official_prices`.`article` = `articles`.`id` 
GROUP BY `articles`.`id`, `official_prices`.`article` 
ORDER BY `articles`.`name`; 
+0

看到我的完整查詢。我在哪裏可以在JOIN中添加一個「LIMIT 1」子句? – silkfire

+0

GROUP_CONCAT解決方案如此駭人聽聞。當然,MySQL一定比這更好的設計了? – silkfire

2

不能使用group byorder這樣。該訂單僅適用於正在返回的完整記錄集,而不適用於該組本身。這將工作:

select o1.* 
from official_prices o1 
inner join 
(
    SELECT `article`, min(`date`) as mdate 
    from `official_prices` 
    WHERE `article` = 2003 
    GROUP BY `article` 
) o2 on o1.article = o2.article and o1.date = o2.mdate 
+0

你可以用我的完整查詢以某種方式調整你的答案嗎? – silkfire