2016-08-17 2 views
1

Предположим, у нас есть две таблицы. Один для человек и один для автомобилей. Теперь я хочу показать список всех автомобилей, ограничив их двумя автомобилями на каждого человека.MySQL GROUP BY - отображение результатов X на группу

С

SELECT c.*, 
     p.* 
FROM  cars c, 
     people p 
WHERE c.carOwnerPeopleId = p.peopleId 
GROUP BY p.peopleId 

Я уже ограничить его 1 автомобиля на людей. Но как мне сделать группу, чтобы показать 2 машины?

Таблица людей

peopleId 
peopleName 

Таблица автомобилей

carId 
carOwnerPeopleId 
carBrand 
carName 

Результаты могут быть:

carId, carOwnerPeopleId, carBrand, carName, peopleId, peopleName 
1, 1, BMW, Series 3, 1, Jon 
1, 1, Audi, A4, 1, Jon 
1, 1, Mercedes, SL AMG, 1, Jon 

Но теперь я хочу, чтобы ограничить его на 2 результатов для "Джона".

+0

@ GordonLinoff действительно, две таблицы, извините за перевод. – Lars

+0

@Lars, обновите свой вопрос с помощью данных образца, структуры db и как результаты должны быть – sagivasan

+0

Пожалуйста, обновите OP с помощью вашей структуры таблицы, а также некоторых данных образца. – daZza

ответ

0

В MySQL, лучший способ, вероятно, использовать переменный:

select c.* 
from people p join 
    (select c.*, 
      (@rn := if(@p = c.carOwnerPeopleId, @rn + 1, 
         if(@p := c.carOwnerPeopleId, 1, 1) 
         ) 
      ) as rn 
     from cars c cross join 
      (select @p := -1, @rn := 0) params 
     order by c.carOwnerPeopleId 
    ) c 
    on c.carOwnerPeopleId = p.PeopleId 
where rn <= 2; 

Вы можете добавить второй ключ к order by если вы хотите два частных автомобилей (два новых, две больших, две самых красных или любых другой).

+0

Это самый эффективный метод? Или фильтрация через PHP может быть более эффективной? – Lars

+0

@Lars. , , Вам нужно будет проверить это, чтобы узнать, что лучше. Если у вас было 20 000 000 строк и только один человек с индексом на 'cars (carOwnerPeopleId)', то, вероятно, быстрее выполнить работу в базе данных. –