1

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

4

2 回答 2

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)。这就是诀窍

于 2013-10-03T14:10:09.113 回答
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如果您在没有聚合函数的情况下进行分组,那么您将获得 ANY,min(p.id)但是这将是组p.id中的ANY g.prod_id,您已指定这是可以的。如果您添加多个字段,例如,p.id, p.name您将得到不可预知的结果,如此链接中的文档所述:

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

于 2013-10-03T14:13:21.407 回答