2016-12-10 1 views
1

У меня есть семинары, в которых есть производители, одна мастерская может иметь много производителей, но только один чиновник. Я хочу, чтобы все мастерские, которые имеют производителя 22, но если у них есть тот же чан получить только семинар, который производитель является OfficalГруппа Mysql по полю и поле предпосылки = 1 в таблице соединений

У меня есть 2 таблицы, первый семинар

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 

Я хочу получить уникальные семинары (группа от vat), но я хочу получить официальный (официальный = 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

проверить эту ссылку, вы можете получить некоторое представление о том, как группа по работе [PHP MySQL GROUP BY ... получить последнее вхождение ] (http://stackoverflow.com/questions/12368974/php-mysql-group-by-get-the-last-occurence) – muneeb

ответ

1

Это приоритет, а не агрегация. Но это довольно сложно.

Следующие получают идентификаторы для мастерских для каждого «чана»:

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; 

Есть два идентификаторов, один, если official доступен, а другие для максимального ид.

Теперь вы можете использовать это в 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. , , В нем отсутствовала группа. –

+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