2017-01-05 4 views
0

Рассмотрим эту таблицу:Change Group приказом

id | machine | manual| etc. 
1  1   0 
2  2   0 
3  1   1 

Я хочу, чтобы получить записи, сгруппированные по машине. Я знаю, что записи вручную всегда вставляются после автоматических. В MySQL я могу это сделать:

SELECT * FROM table GROUP BY machine DESC 

И записи извлекаемые являются:

id | machine | manual| etc. 
2  2   0 
3  1   1 

Поскольку GROUP BY в MySQL работает в ASC и первая запись находит это один считает он. Поэтому, поместив DESC в GROUP BY, он работает в обратном порядке, и поскольку я знаю, что руководства всегда появляются после того, как это будет работать для моего решения. Но как я могу это сделать в Доктрине?

$qb = Query Builder 'b' 
$qb->groupBy('b.machine DESC'); 

Кто-нибудь знает, как это сделать без суб-запросов? Спасибо

+0

попробуйте использовать 'orderBy ('b.machine', 'DESC');' –

+0

@NishantNair Order By применяется после того, как группа выполнена, поэтому она не решает мою проблему. – Danubio

ответ

0

Ваше решение с group by противоречит стандарту sql и может не работать, если в MySQL настроена только полная группа по sql-модулю. Это значение по умолчанию для последних версий MySQL.

Поскольку вы хотите последнюю запись, идентифицированного автоматическое приращение идентификатора, вы можете достичь ожидаемого результата с себя left join:

select t1.* 
from table t1 
left join table t2 on t1.machine=t2.machine and t1.id<t2.id 
where t2.id is null 

В основном, с t1.id<t2.id условие соединения вы получите все записи, где t2.id для той же машины больше. Если большее значение t2.id не найдено, возвращается значение null - это означает, что это последняя запись для данной машины. Это рекорд, который мы сохраняем с предложением where t2.id is null.

+0

У меня уже есть решение, если то, что я просил, не может быть сделано. Благодаря :) – Danubio