首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:在父表中选择在子表中有两行的行(一对多)

MySQL:在父表中选择在子表中有两行的行(一对多)
EN

Stack Overflow用户
提问于 2016-06-21 20:50:03
回答 3查看 232关注 0票数 0

我有两个表"parent“和"child”,具有一对多的关系。

我希望从“父”表中抓取“子”表中行状态为“pending”和“approved”的所有记录

例如“制造商”表:

代码语言:javascript
复制
id, name 
1, Boots
2, Audi
3, AVG

“型号”表:

代码语言:javascript
复制
id, manufacturer_id, status (int) 
1, 1, pending
2, 1, failed
3, 1, approved
4, 2, failed
5, 3, approved

我想要抓取所有拥有状态为“待处理”和“已批准”的型号的制造商。给定上述数据,mysql应该返回" Boots“,因为在"models”中,Boot有一个状态为"pending“(id = 1)和"approved”(id = 5)的记录

EN

回答 3

Stack Overflow用户

发布于 2016-06-21 20:53:29

您可以使用以下查询来获取与status15相关的制造商的ids

代码语言:javascript
复制
SELECT manufacturer_id
FROM models
WHERE status IN (1,5)
GROUP BY manufacturer_id
HAVING COUNT(DISTINCT status) = 2

现在,您可以使用上面的查询作为子查询,以获得预期的结果集:

代码语言:javascript
复制
SELECT *
FROM manufacturers
WHERE id IN ( ... above query here ...)
票数 0
EN

Stack Overflow用户

发布于 2016-06-21 21:01:49

代码语言:javascript
复制
select distinct man.name from manufacturers man, models mod
where man.id = mod.manufacturer_id
and mod.status in ('pending', 'approved')
票数 0
EN

Stack Overflow用户

发布于 2016-06-21 21:04:49

http://sqlfiddle.com/#!9/9c1e32/3

代码语言:javascript
复制
SELECT m.*
FROM manufacturers m
JOIN models
ON m.id = models.manufacturer_id
GROUP BY m.id
HAVING MAX(IF(models.status=1,1,0))+MAX(IF(models.status=2,1,0))=2

更新我不知道你为什么改变你的操作,但是如果你的status不再是整数,你可以:

代码语言:javascript
复制
SELECT m.*
FROM manufacturers m
JOIN models
ON m.id = models.manufacturer_id
GROUP BY m.id
HAVING MAX(IF(models.status='pending',1,0))+MAX(IF(models.status='approved',1,0))=2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37944948

复制
相关文章

相似问题

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