2016-09-14 87 views
0

我已經在MySQL以下查詢:GROUP BY訂貨

select territory_id, platform_type_id, p.store_url 
    from main_itemmaster m 
    inner join main_iteminstance i on m.id=i.master_id 
    inner join main_territorypricing p on p.item_id=i.id 
    inner join main_territorypricingavail a on a.tp_id=p.id 
    where imdb_url = 'http://imdb.com/title/tt1576422/' 
group by platform_type_id 

使我有以下幾點:

territory_id platform_type_id store_url 
US Amazon http://www.amazon.com/dp/B00EQIHJAG 
PT ITUNES https://itunes.apple.com/pt/movie/id582142080 

不過,我希望做一個GROUP BY返回territory_id = 「US」首先如果存在。我會怎麼做?

這是我嘗試的一種方式,看起來很髒,但不工作的MySQL版本,我使用的是:

select * from 
(select territory_id, platform_type_id, p.store_url from main_itemmaster m 
    inner join main_iteminstance i on m.id=i.master_id 
    inner join main_territorypricing p on p.item_id=i.id 
    inner join main_territorypricingavail a on a.tp_id=p.id 
where imdb_url = 'http://imdb.com/title/tt1576422/' 
order by territory_id='us' desc 
) x group by platform_type_id 

其中給出:

territory_id platform_type_id store_url 
US Amazon http://www.amazon.com/dp/B00EQIHJAG 
US ITUNES https://itunes.apple.com/us/movie/id582142080 

這是正確的結果集我期待得到。

這裏是一個SQL小提琴的鏈接。我將所有數據壓縮到一個表中,以便將注意力集中在GROUP BY語句上:http://sqlfiddle.com/#!9/81c3b6/2/0

+1

您所查詢的是畸形的,因爲'select'列表是用'組by'列不兼容。 –

+0

如果您需要以特定順序返回的行,請添加ORDER BY子句。其他數據庫會反對這個查詢,引發一個關於「SELECT列表中非GROUP BY中的非聚合表達式」的錯誤。 MySQL特定擴展(默認啓用)允許查詢執行。你確定你需要或想要一個GROUP BY操作嗎? – spencer7593

+0

@GordonLinoff它是MySQL。它接受這個沒有錯誤,除非另有配置:( –

回答

2

因此,從註釋和SqlFiddle的添加它實際上似乎您想要創建一個分區的行號,優先於美國每個平臺然後選擇第一條記錄。在MySQL做分割行數的一種方法是使用變量這裏有一個例子:

SELECT 
    territory_id 
    ,platform_type_id 
    ,store_url 
FROM 
(SELECT 
    * 
    ,@PlatFormRowNum:= IF(@prevplatform = platform_type_id, @PlatFormRowNum + 1, 1) as PlatformRowNum 
    ,@prevplatform:= platform_type_id 
    FROM 
    main_itemmaster m 
    CROSS JOIN (SELECT @prevplatform:='',@PlatFormRowNum=0) var 
    ORDER BY 
    platform_type_id 
    ,CASE WHEN territory_id = 'US' THEN 0 ELSE 1 END 
    ,territory_id 
) t 
WHERE 
    t.PlatformRowNum = 1 
ORDER BY 
    t.platform_type_id 

SQL小提琴:http://sqlfiddle.com/#!9/81c3b6/12

基本上這個分區通過平臺的行號,之前的任何其他領土,然後命令我們選擇第一行的foreach平臺。一個問題/訣竅是,如果美國不適用於該平臺,那麼只需按照字段升序字母排序來選擇要返回哪一個?

+0

沒有不工作,因爲它做了'ORDER BY'前'GROUP BY'語句,所以我仍然得到同樣的結果。 – David542

+0

@ David542我不是遵循你的推理,爲什麼它會給你同樣的結果?這個小組通過發生,然後順序是確定的,所以它應該發生在事實之後,這就是爲什麼我們幾個人回答同樣的問題。我們是否錯過了你想要結果的方式? – Matt

+0

這給了我52個結果,但我只是在尋找2個結果。一個用於美國亞馬遜,一個用於美國iTunes。 – David542