2016-09-14 62 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