Подскажите как правильно написать один SQL запрос к базе данных

Topfer

Новичок
Всем постояльцам данного форума огромный привет!

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

В общем решил я добавить на свой сайт расширенный фильтр объявлений и для этого мне пришлось скачать плагин дополнительных атрибутов (чтобы была возможность при публикации объявлений настраивать доп. поля, такие как: площадь, этаж, кол-во этажей в доме и т.д.).

Так вот все сделал кроме этого.

В фильтре я добавил возможность выбора диапазона этажей, на котором расположена квартира (к примеру с 1 по 30). И справа от этого поля поставил чекбокс "Не последний этаж".

Т.е. по сути при выборе этого поля фильтра должны показываться все объявления из заданного диапазона за исключением тех квартир, которые расположены на последнем этаже. А как составить такой запрос я ума не приложу.

Таблица имеет следующие поля:

pk_i_id - первичный ключ + автоинкримент
fk_i_item_id - ID - объявления
fk_i_field_id - ID атрибута
s_value - значение атрибута в объявлении

В качестве примера прикладываю данные из этой таблицы.

pk_i_id fk_i_item_id fk_i_field_id s_value
4 1 6 3
5 1 7 5
10 2 6 4
11 2 7 5
16 3 6 10
17 3 7 10

Где fk_i_field_id c ID = 6 - это этаж, на котором расположена квартира, а
fk_i_field_id с ID = 7 - кол-во этажей в доме.

Получается, что нужно составить объединенный запрос SELECT с выбором всех fk_i_item_id WHERE fk_i_field_id = 6 AND s_value BETWEEN 1 AND 30 и второй запрос где fk_i_field_id = 7 и s_value этажей в доме не равно этажу квартиры.

Вот как правильно написать такой запрос я даже ума не приложу...
 

AnrDaemon

Продвинутый новичок
HAVING этаж <> количество

Но как быть с домами, в которых первый этаж коммерческий и нумерация идёт со второго?
 

Topfer

Новичок
HAVING этаж <> количество

Но как быть с домами, в которых первый этаж коммерческий и нумерация идёт со второго?
Подскажи и как тогда должен выглядеть этот запрос? Надо чтобы это был один запрос, а не несколько.

SELECT
fk_i_item_id FROM `Table_Name` WHERE fk_i_field_id = 6 AND s_value BETWEEN 1 AND 30 HAVING s_value != (SELECT s_value FROM `Table_Name` WHERE fk_i_field_id = 7)

Или как?

У меня ж этаж квартиры и кол-во этажей в доме хранятся в разных строчках, а не в одной

PS: почитал мануал HAVING в моем случае как я понимаю НЕ подойдет, т.к. он использует aggregate_function, а здесь ее нельзя использовать, т.к. для каждой квартиры свой дом с уже заданной этажностью. Или же я чего-то не понимаю..
 
Последнее редактирование:

Topfer

Новичок
Мне как-то надо в одном запросе выбрать все ID объявлений с ID атрибута = 6 в диапазоне от 1 до 30 и в этом же запросе получить значение s_value с ID атрибута = 7, где ID - объявления из 1 и 2 запроса были одинаковыми. Еще и чтобы s_value ID атрибута 6 НЕ равнялось s_value ID атрибута 7
 

Topfer

Новичок
Есть конечно самый простой вариант, добавить в таблицу поле is_last с типом TINYINT и по умолчанию 0.

И уже при публикации объявления сравнивать значение переданные в полях этаж и этажей в доме. В случае, если они одинаковые, апдейтить поле is_last с 0 на 1.

А в фильтре уже делать выбор по этому полю AND is_last = 0
но это уж слишком примитивный вариант, а хочется добиться элегантного решения без правки плагина атрибутов.

Если вы мне скажите, что моя задумка с SQL запросами нереализуема, придется прибегнуть к такому варианту решения проблемы.
 
Сверху