powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите с запросом, где параметры - это не поля, а строки
18 сообщений из 18, страница 1 из 1
Помогите с запросом, где параметры - это не поля, а строки
    #39843412
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предисловие.
У каждого пользователя может быть свой разный набор параметров - пользователь на сайте создает заявку для получения рассылки. Пользователь оставляет заявку с параметрами: мин и/или макс цена, мин и/или макс этаж, список типов, список районов и т.д. Поторм, когда в базу добавляются объявления с некими параметрами: цена, кол-во комнат, этаж, тип, район, нужно найти подходящих пользователей, чтобы отправить им оповещения.

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


Не могу сообразить, как правильно составить запрос.

Firebird 3.

детальная, поле
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE TTELEGRAMMAILINGPARAM (
    ID                 INTEGER NOT NULL,
    TTELEGRAMUSERS_ID  INTEG, /*детальный ключ, который ссылается на главную таблицу пользователей*/
    PNAME              STRING32,
    PTYPE              INTEG,
    PVAL               STRING512
);



Всё это будет в хранимой процедуре.
Заранее благодарен.
...
Рейтинг: 0 / 0
Помогите с запросом, где параметры - это не поля, а строки
    #39843414
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Есть таблица пользователей и вторая (детальная) с параметрами объектов.
Суть в том, что параметры объектов - это не поля, а строки (см. снимок таблицы).
имеется ввиду, что это параметры заявок на объекты (объявления)
...
Рейтинг: 0 / 0
Помогите с запросом, где параметры - это не поля, а строки
    #39843433
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Не могу сообразить, как правильно составить запрос.Если ты не можешь сообразить как по одному полю PTYPE элементарно связать две таблички и реализовать проверку диапазонов, то, скорее всего, ты не программист и это не твоё.
...
Рейтинг: 0 / 0
Помогите с запросом, где параметры - это не поля, а строки
    #39843438
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Шахматка нужна? Т.е. транспонирование таблицы?
...
Рейтинг: 0 / 0
Помогите с запросом, где параметры - это не поля, а строки
    #39843444
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI, тоже так думаю
...
Рейтинг: 0 / 0
Помогите с запросом, где параметры - это не поля, а строки
    #39843449
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

ну ты так вопрос задал что я сначала ничего не понял. Транспонирование таблицы лучше на клиенте делать, есть специальные гриды.
Запросами тоже можно, но это работает только для фиксированного количества полей
...
Рейтинг: 0 / 0
Помогите с запросом, где параметры - это не поля, а строки
    #39843451
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть два типа людей: одни способны вкурить EAV, другие делают из неё шахматку.

Тебе нужен запрос класса
Код: sql
1.
2.
3.
4.
5.
where (PNAME='Param1' and PVAL='Val1')
  or (PNAME='Param2' and PVAL='Val2')
  or (PNAME='Param3' and PVAL='Val3')
group by TTELEGRAMUSERS_ID
having count(*) >= 3


и решить как вычислять релевантность.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с запросом, где параметры - это не поля, а строки
    #39843453
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

например, читаешь все параметры в переменные процедуры, затем:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare variable PriceMin ...;
declare variable PriceMax ...;

select PriceMin from params into  :PriceMin

select ... from ...
where 
  :PriceMin is null or price >= :PriceMin
    and
  :PriceMax is null or price <= :PriceMax
    and
...



...
Рейтинг: 0 / 0
Помогите с запросом, где параметры - это не поля, а строки
    #39843455
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисну ты так вопрос задал что я сначала ничего не понял. Транспонирование таблицы лучше на клиенте делать, есть специальные гриды.
X11Всё это будет в хранимой процедуре.
...
Рейтинг: 0 / 0
Помогите с запросом, где параметры - это не поля, а строки
    #39843458
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЕсть два типа людей: одни способны вкурить EAV, другие делают из неё шахматку.

Тебе нужен запрос класса
Код: sql
1.
2.
3.
4.
5.
where (PNAME='Param1' and PVAL='Val1')
  or (PNAME='Param2' and PVAL='Val2')
  or (PNAME='Param3' and PVAL='Val3')
group by TTELEGRAMUSERS_ID
having count(*) >= 3



и решить как вычислять релевантность.

да, я как раз похожий запрос и сделал... но пока без "group by TTELEGRAMUSERS_ID
having count(*) >= 3"
но он не работает как надо...
ещё раз перепроверю
...
Рейтинг: 0 / 0
Помогите с запросом, где параметры - это не поля, а строки
    #39843463
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёё
X11,

например, читаешь все параметры в переменные процедуры, затем:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare variable PriceMin ...;
declare variable PriceMax ...;

select PriceMin from params into  :PriceMin

select ... from ...
where 
  :PriceMin is null or price >= :PriceMin
    and
  :PriceMax is null or price <= :PriceMax
    and
...




Ой, ну и фигню я написал.
...
Рейтинг: 0 / 0
Помогите с запросом, где параметры - это не поля, а строки
    #39843474
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то не так? Что я забыл?
Вот запрос без HAVING COUNT(*) >= 3


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT TTELEGRAMUSERS_ID, PNAME, PTYPE, PVAL FROM TTELEGRAMMAILINGPARAM WHERE

(PNAME = 'PriceMin' AND 26000 >= PVAL)
OR
(PNAME = 'PriceMax' AND 26000 <= PVAL)

OR

(PNAME = 'FloorMin' AND 3 >= PVAL)
OR
(PNAME = 'FloorMax' AND 3 <= PVAL)

GROUP BY TTELEGRAMUSERS_ID, PNAME, PTYPE, PVAL



результат на картинке.
А если добавить в запрос строку "HAVING COUNT(*) >= 3", то записей ноль
...
Рейтинг: 0 / 0
Помогите с запросом, где параметры - это не поля, а строки
    #39843486
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Что я забыл?

Мозг включить. Бросай EAV, не заработает оно у тебя.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с запросом, где параметры - это не поля, а строки
    #39843493
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё, получилось.

Dimitry Sibiryakov, спасибо.

Я понял идёю.

вот запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT TTELEGRAMUSERS_ID FROM TTELEGRAMMAILINGPARAM WHERE

(PNAME = 'PriceMin' AND 26000 >= PVAL)
OR
(PNAME = 'PriceMax' AND 26000 <= PVAL)
OR
(PNAME = 'FloorMin' AND 3 >= PVAL)
OR
(PNAME = 'FloorMax' AND 3 <= PVAL)

GROUP BY TTELEGRAMUSERS_ID
HAVING COUNT(*) >= 4



и идея в том, что если 4 параметра, то и в HAVING COUNT должно быть 4, а если будет 6 параметров, и в HAVING COUNT должно быть тоже 6.
Т.е. сколько параметров, столько в итоговой группе должно быть записей, не меньше.
...
Рейтинг: 0 / 0
Помогите с запросом, где параметры - это не поля, а строки
    #39843496
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно и меньше при нестрогом поиске. Это от задачи зависит. Я не зря упомянул про
релевантность.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с запросом, где параметры - это не поля, а строки
    #39843549
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я что-то не знаю, наверное.
Есть 2 запроса: с параметрами и без
Выполняю оба запроса в IBExpert.

С параметрами
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT TU.TELEGRAM_ID FROM TTELEGRAMMAILINGPARAM MP
    INNER JOIN TTELEGRAMUSERS TU  ON TU.ID = MP.TTELEGRAMUSERS_ID
    WHERE
    
    (MP.PNAME = 'PriceMin' AND :OBJP >= MP.PVAL)
    OR
    (MP.PNAME = 'PriceMax' AND :OBJP <= MP.PVAL)
    OR
    (MP.PNAME = 'FloorMin' AND :OBJF >= MP.PVAL)
    OR
    (MP.PNAME = 'FloorMax' AND :OBJF <= MP.PVAL)
      
    GROUP BY 1
    HAVING COUNT(*) >= 4



без параметров:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT TU.TELEGRAM_ID FROM TTELEGRAMMAILINGPARAM MP
    INNER JOIN TTELEGRAMUSERS TU  ON TU.ID = MP.TTELEGRAMUSERS_ID
    WHERE
    
    (MP.PNAME = 'PriceMin' AND 25000 >= MP.PVAL)
    OR
    (MP.PNAME = 'PriceMax' AND 25000 <= MP.PVAL)
    OR
    (MP.PNAME = 'FloorMin' AND 4 >= MP.PVAL)
    OR
    (MP.PNAME = 'FloorMax' AND 4 <= MP.PVAL)

    GROUP BY 1
    HAVING COUNT(*) >= 4



в первом случае (с параметрами) - 1 запись в результате, а во втором случае - 2 записи.

Само собой, что параметры заполняю теми же значениями, что и в запросе без параметров.
...
Рейтинг: 0 / 0
Помогите с запросом, где параметры - это не поля, а строки
    #39843551
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

преобразование типов. Попробуй в первом запросе поставить строковые литералы
...
Рейтинг: 0 / 0
Помогите с запросом, где параметры - это не поля, а строки
    #39843555
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точно! Спасибо!
забыл, что PVAL у меня - текстовое поле

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT TU.TELEGRAM_ID FROM TTELEGRAMMAILINGPARAM MP
    INNER JOIN TTELEGRAMUSERS TU  ON TU.ID = MP.TTELEGRAMUSERS_ID
    WHERE
    
    (MP.PNAME = 'PriceMin' AND :OBJP >= CAST(MP.PVAL AS INTEG))
    OR
    (MP.PNAME = 'PriceMax' AND :OBJP <= CAST(MP.PVAL AS INTEG))
    OR
    (MP.PNAME = 'FloorMin' AND :OBJF >= CAST(MP.PVAL AS INTEG))
    OR
    (MP.PNAME = 'FloorMax' AND :OBJF <= CAST(MP.PVAL AS INTEG))
    
    GROUP BY 1
    HAVING COUNT(*) >= 4
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите с запросом, где параметры - это не поля, а строки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]