首页
学习
活动
专区
圈层
工具
发布

Mysql多组
EN

Stack Overflow用户
提问于 2013-10-03 13:59:36
回答 2查看 81关注 0票数 1

我有一个产品表,它有一个product_id,还有另一个表,它有一个组。让我们说:

代码语言:javascript
复制
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

我需要一个查询,从每组只得到一个产品。我试过这个:

代码语言:javascript
复制
select * from product as p
left join g_product as g on p.id = g.fk_prod
group by group_id

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

我不认为这样的结果:

代码语言:javascript
复制
1 - Shoes
3 - apple
4 - any thing

这是第一组的产品1,而3和4还没有分组。

我认为它可以处理以下查询:

代码语言:javascript
复制
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秒的时间才能运行,而且很长时间。我知道有办法快点做到这一点。但我想不出

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-03 14:10:09

使用此查询获取适当的结果。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-10-03 14:13:21

以下是我的最后版本:)

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19161236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档