2013-10-03 51 views
1

我有一個產品表,它有一個product_id, 而我有其他表有它像一個組。 比方說:Mysql Multi Group通過

Product table(product): 
ID NAME 
1 - Shoes 
2 - T-shirt 
3 - apple 
4 - any thing 
5 - lorem ipsum 
_______________________________________________ 
Group product table(g_product): 
ID - GROUP ID - PRODUCT ID 
1   1    1 
2   1    2 
3   1    5 

我需要一個查詢,以從各組獲得1個產品。 我已經試過這樣:

select * from product as p 
left join g_product as g on p.id = g.fk_prod 
group by group_id 

但是,這帶給我只是分組的產品。

我wan't這個結果:

1 - Shoes 
3 - apple 
4 - any thing 

這是從組1中的產品1,3和4沒有基。

我想,這與此查詢工作:

select * from product as p 
left join g_product as g on p.id = g.fk_prod 
group by g.group_id 
union 
select * from product as p 
left join g_product as g on p.id != g.fk_prod 
group by p.id 

但是這需要30秒的運行,這是很多。我知道有一種方法可以快速做到這一點。但我不明白

+0

爲什麼'Shoes'而不是'T-Shirt'在你的樣品輸出? –

+0

Becouse鞋是第一個來自分組產品的產品,我只需要其中一個產品,當我通過group_id對產品進行分組時,它會帶來第一個權利?可以是任何一個。 – Guerra

+0

因此,基本上,您想要從每個組中獲得一個產品,以及不屬於任何組的所有產品? – Zagor23

回答

1

使用此查詢來獲取相應的結果

SELECT p.*, 
(CASE WHEN g.gid IS NOT NULL THEN g.gid ELSE -1*p.id END) AS temp_group_id 
FROM product AS p 
LEFT JOIN g_product AS g ON p.id = g.fk_prod 
GROUP BY temp_group_id 

這裏,如果產品不屬於任何組,然後我們分配虛擬組ID(-1 * p.id)至它。並且,使的伎倆

+0

謝謝你的答案,但我不能讓這個「案例」的作品。創建此錯誤您的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,在'CASE ' 附近使用正確的語法作爲tmpgrupo – Guerra

+0

我已更改查詢,請立即測試 –

+0

選擇不在組中的字段時應非常小心。你會得到不可預知的結果。請參閱此鏈接(http://stackoverflow.com/questions/18710064/which-rows-fields-are-returned-when-grouping-with-mysql/18710186#18710186)或[官方文檔](http:///dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html)以獲取更多信息。 –

0

這裏是我的最終版本:)

select * from products 
where id in (
    select p.id from products p 
    left join g_product g on g.product_id = p.id 
    group by g.prod_id 
) 

注意,你會得到任何p.id如果按沒有聚合函數,例如min(p.id)但會有任何p.idg.prod_id組,你已經指定了這個組。如果添加多個字段多,比如p.id, p.name那麼你將得到不可預知的結果作爲文檔狀態在這個環節:

http://dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html

+0

我的產品表有多於40K的產品。您的查詢獲得60秒以上的運行時間。 =/ – Guerra

+0

然後我敢打賭你沒有正確的索引。 40k是一個相當小的數字 –