2016-06-21 14 views
0

1対多の関係を持つ2つのテーブル "親"と "子"があります。MySQL:子テーブルの2つの行(1対多)を持つ親テーブルの行を選択

私は「保留」と「承認」「子供」テーブルの行のステータスを持っています「親」テーブルからすべてのレコードをつかむしたい

例えば 「メーカー」テーブル:

id, name 
1, Boots 
2, Audi 
3, AVG 

「モデル」テーブル:

id, manufacturer_id, status (int) 
1, 1, pending 
2, 1, failed 
3, 1, approved 
4, 2, failed 
5, 3, approved 

私は、ステータスを持つモデルを持っているすべてのメーカーをつかむしたい「保留」と「承認」。上記のデータが与えられていると、 "モデル"ではBootsがステータスが "保留中"(ID = 1)で "承認済み"(id = 5)のレコードがあるため、mysqlは "Boots"を返します。

+0

ねえ、あなたは皆を混乱:-)待ちます。 - )、他の ''保留中 '、' failed '、' approved''の 'status(int)'の一方で 'status'カラムの型は何ですか? – Alex

答えて

0

次のクエリを使用してstatus15の両方に関連しているそれらのメーカーのIDS:

SELECT * 
FROM manufacturers 
WHERE id IN (... above query here ...) 
+0

'..status in(1,5)...' – 1000111

+0

@ 1000111はい、そうです、私は答えを修正しました。 –

0
select distinct man.name from manufacturers man, models mod 
where man.id = mod.manufacturer_id 
and mod.status in ('pending', 'approved') 

SELECT manufacturer_id 
FROM models 
WHERE status IN (1,5) 
GROUP BY manufacturer_id 
HAVING COUNT(DISTINCT status) = 2 

あなたは今期待される結果セットを取得するために、サブクエリとして上記のクエリを使用することができます

0

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

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 

更新あなたのOPを変更し、なぜ私は考えているが、あなたのstatusはもうint型されていない場合、次のことができます。

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 
関連する問題