我有一个产品表,它有一个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我需要一个查询,从每组只得到一个产品。我试过这个:
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,而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秒的时间才能运行,而且很长时间。我知道有办法快点做到这一点。但我想不出
发布于 2013-10-03 14:10:09
使用此查询获取适当的结果。
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-03 14:13:21
以下是我的最后版本:)
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 ),那么您将得到任何p.id,但这将是g.prod_id组中的任何p.id,您已经指定了这一点。如果添加多个字段(如p.id, p.name ),则会得到不可预测的结果,因为文档在此链接中声明:
http://dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html
https://stackoverflow.com/questions/19161236
复制相似问题