2016-12-10 10 views
1

私は製造業者を持つワークショップを持っていますが、1つのワークショップには多くの製造業者がいるかもしれませんが、ただ1人の公式です。私はメーカーの22を持っているすべてのワークショップを取得したいが、彼らは同じバットを持っている場合にのみ、私は2つのテーブルを持っているメーカーはMysqlグループbyおよびjoinテーブルの優先フィールド= 1

公式でのワークショップ、最初のワークショップ

id | name   | vat 
------------------------- 
1 | name 1  | B12 
2 | name 2  | B12 
3 | name 3  | B12 
4 | name 4  | E98 
5 | name 5  | A99 

二workshop_manufacturer

id | workshop_id | manufacturer_id | official 
---------------------------------------------- 
1 | 1   | 22    | 0    
2 | 2   | 22    | 0 
3 | 3   | 22    | 1 
4 | 4   | 22    | 0 
5 | 5   | 22    | 1 
5 | 5   | 23    | 0 
5 | 5   | 24    | 0 

を取得しますユニークなワークショップ(バットでグループ化)をしたいのですが、このメーカーと同じバットを持つワークショップがたくさんある場合は、公式のもの(公式= 1)を取得したいと思います。私はこのクエリを行う場合は

SELECT t1.*,t2.* FROM workshop t1 
INNER JOIN workshop_manufacturer t2 ON t1.id=t2.workshop_id 
WHERE t2.manufacturer.id = 22 
GROUP bY t1.vat 

を、私はこの取得:

id | name | vat | official | manufacturer_id 
----------------------------------------------- 
1 | name 1 | B12 | 0  | 22 
4 | name 4 | E98 | 0  | 22 
5 | name 5 | A99 | 1  | 22 

を、私はこれをしたい:公式と非公式です

id | name | vat | official | manufacturer_id 
----------------------------------------------- 
3 | name 3 | B12 | 1  | 22 
4 | name 4 | E98 | 0  | 22 
5 | name 5 | A99 | 1  | 22 

すべてのワークショップが、公式の人を優先する。

+0

チェックこのリンクをどのようBY ...最後の発生を取得する作業 [PHPのmysqlグループでグループ](http://stackoverflow.com/questions/12368974/php-mysql-group-by-get-the-last-occurence) – muneeb

答えて

1

これは集計ではなく、優先順位付けです。しかし、それはかなり複雑です。

次は、各「バット」のためのワークショップのIDを取得します:officialが利用可能で、最大idの別の場合

select w.vat, max(case when w.official = 1 then w.id end) as official_id, 
     max(w.id) as max_id 
from workshop_manufacturer wm join 
    workshop w 
    on w.id = wm.workshop_id 
group by w.vat; 

は2つのID、1があります。

あなたは今、残りのフィールドを取得するためにjoinでこれを使用することができます:あなたは、いくつかの洞察を得るかもしれない、

select w.workshop_id, w.name, w.vat, 
     (official_id is not null) as official 
from (select w.vat, max(case when w.official = 1 then w.id end) as official_id, 
      max(w.id) as max_id 
     from workshop_manufacturer wm join 
      workshop w 
      on w.id = wm.workshop_id 
     group by w.vat 
    ) v join 
    workshop w 
    on w.id = coalesce(official_id, max_id); 
+0

このクエリで私はただ一つの結果しか得ていない。私はすべてのワークショップを受けたいと思っています。私はより多くの情報で私の質問を編集しました。 – h3llr4iser

+0

@ h3llr4iser。 。 。それは 'group by'を欠いていた。 –

+0

グループで働いている!ありがとうございました!! – h3llr4iser

0

これを試してください。

SELECT t1.*,t2.* FROM workshop t1 
INNER JOIN workshop_manufacturer t2 ON t1.id=t2.workshop_id 
GROUP bY t1.vat having t2.official = 1 
+0

ここで私は正式なものを取得していますが、私は公式でない人も必要です – h3llr4iser

関連する問題