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