GROUP BY订购

时间:2016-09-14 19:57:52

标签: mysql sql

我在mysql中有以下查询:

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 个答案:

答案 0 :(得分: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

基本上,它按平台划分行号,在任何其他地区之前命令US,然后选择第一行foreach平台。一个问题/诀窍是,当美国不能用于平台时,你如何选择返回哪个只是按land_id的升序字母顺序?