powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поиск по группам тегов
6 сообщений из 6, страница 1 из 1
Поиск по группам тегов
    #39311006
asimo92
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

Есть задача - поиск по тегам. Я её в принципе решил кое-как, но интересует есть ли какое нибудь хорошее альтернативное решение - возможно кто нибудь уже делал подобное.

Описание задачи:

Есть таблица людей (people), у каждого человека есть 3 тега в отдельной таблице (people_tag). Содержание тегов - характеристика человека, т.е. всегда что-то из этого: <man|woman>,<tall|short>,<fat|thin>. Также у каждого тега есть некий threshold по которому идёт фильтрация, если значение threshold меньше искомого - тег отсекается.

Нужно уметь искать ID людей по таким запросам:
request<man or woman> and <short> and <fat or thin>
request<man> and <tall>

В первом случае нужно найти мужчину или женщину, которая низкого роста и толстая или худая.
Во втором случае нужно найти высокого мужчину.

Менять текущую структуру таблицы нельзя.

Посмотреть текущее решение и поиграться можно тут: http://sqlfiddle.com/#!15/97d788/16
...
Рейтинг: 0 / 0
Поиск по группам тегов
    #39311075
VladimirDmitriev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT DISTINCT t1.people_id
FROM people_tag t1
INNER JOIN people_tag t2
  ON (t1.tag IN ('man', 'woman'))
 AND (t2.people_id = t1.people_id)
 AND (t2.tag = 'short')
INNER JOIN people_tag t3
  ON (t3.people_id = t1.people_id)
 AND (t3.tag IN ('fat', 'thin'))



Код: sql
1.
2.
3.
4.
5.
6.
SELECT DISTINCT t1.people_id
FROM people_tag t1
INNER JOIN people_tag t2
  ON (t1.tag = 'man')
 AND (t2.people_id = t1.people_id)
 AND (t2.tag = 'tall')
...
Рейтинг: 0 / 0
Поиск по группам тегов
    #39311076
VladimirDmitriev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мда, кунг-фу с array_agg круче
...
Рейтинг: 0 / 0
Поиск по группам тегов
    #39311079
VladimirDmitriev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда уже второй вариант будет такой:
Код: sql
1.
2.
3.
4.
5.
6.
select people_id from (
    select
        people_id,
        array_agg(tag) as tags from people_tag group by people_id
    ) as t
where (tags @> '{man, tall}'::text[]);


Иначе вся красота теряется :-)
...
Рейтинг: 0 / 0
Поиск по группам тегов
    #39311087
VladimirDmitriev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И самое оптимальное так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select people_id from (
    select
        people_id,
        array_agg(tag) as tags
        from people_tag
        where tag = ANY('{man, tall}'::text[])
        group by people_id
    ) as t
where (tags @> '{man, tall}'::text[]);
...
Рейтинг: 0 / 0
Поиск по группам тегов
    #39311175
asimo92
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VladimirDmitriev,

Спасибо. Взял кое-что на заметку.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поиск по группам тегов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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