SQL: запрос на выборку записей с группировкой по родителю?

Здравствуйте,
Задача такова:
На рынке недвижимости существуют как объекты-"одиночки" (например, точечная застройка, всего один дом), так и группы объектов (жилой комплекс с кучей корпусов,коттеджный поселок с таунами, участками).

На каждый объект (корпус, таунхаус в поселке, коттедж в поселке и т.д.) в таблице лежит запись.
Для тех объектов, которые входят в группу (ЖК, поселок и т.д.), существует дополнительная родительская запись, и связь между ними строится по parent_id в этой же таблице.

Пример:
id 	| parent_id	| object_type 	| ...
----------------------------------------------
1 	| 0 		| common 	| ...
2 	| 0 		| newflats 	| ...
3 	| 1 		| newflats 	| ...   
4 	| 1 		| newflats 	| ...
5 	| 0 		| cottage 	| ...


При поиске объектов пользователю выводится выборка объектов из таблицы по заданным условиями (по цене, площади, удаленности и т.д.), исключая родительские карточки, при этом в определенной сортировке, например по цене.

Но т.к. корпусов в одном ЖК может быть 10-20, и все они зачастую одновременно соответствуют заданным критериям, то они могут занимать всю первую страницу выдачи.

Пример текущей выдачи:

SELECT * FROM objects WHERE object_type!='common' AND ....


id 	| parent_id 	| object_type 	| ...
-----------------------------------------------
7 	| 0 		| newflats 	| ...
3 	| 1 		| newflats 	| ...   
4 	| 1 		| newflats	| ...
2 	| 0 		| newflats 	| ...


Суть задачи:
Модифицировать запрос так, чтобы в случае наличия у записи родительской записи (parent_id > 0) в выдаче оставалась только одна дочерняя запись на каждого родителя (первая из всех согласно заданной сортировке), а оставшиеся игнорировались.

Т.е. выдача после изменения запроса должна выглядеть как-то так:

id 	| parent_id 	| object_type 	| ...
-----------------------------------------------
7 	| 0 		| newflats 	| ...
3 	| 1 		| newflats 	| ...   
2 	| 0 		| newflats 	| ...


Т.е. в выдаче есть 2 объекта, у которых parent_id = 1.
Первый из них в текущей сортировке - с id=3
Значит, надо оставить его, а все последующие с parent_id=1 - игнорировать.

Вот. Вечер, кофе, мешки под глазами. Туплю. Прошу вашей помощи.
Копаю пока группировку по parent_id из подзапроса с сортировкой. Но что-то как-то не выходит каменный цветок
  • Вопрос задан
  • 2678 просмотров
Пригласить эксперта
Ответы на вопрос 1
Fadmin
@Fadmin
Самый тупой вариант, сделать distinct выборку где parent_id > 0 а потом объеденить
с выборкой где parent_id = 0.

Еще могу добавить, что несмотря на мешки, надо было вывалить скрипты для создания и заполнения таблиц, вам бы написали запрос примерно минут за 7, не больше.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы