Mysql Multi Group By

时间:2013-10-03 13:59:37

标签: mysql sql

我有一个产品表,它有一个product_id, 我有其他表,它有一个团体。 让我们说:

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

但这给我带来了分组的产品。

我不是这个结果:

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秒才能运行,而且还有很多。我知道有办法快速做到这一点。但我无法想象

2 个答案:

答案 0 :(得分: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)。并制作技巧

答案 1 :(得分: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.id组中的任何g.prod_id都是p.id, p.name已经说明没关系。如果您添加多个字段,例如{{1}},那么您将获得不可预测的结果,如此链接中的文档所示:

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