我在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
答案 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的升序字母顺序?