Мое предложение SELECT внутри моей функции postgres ARRAY (), похоже, не создает правильный синтаксис массива - PullRequest
0 голосов
/ 11 апреля 2020

Я строю массив из условия выбора в моем WHERE состоянии

SELECT m.* 
FROM users AS u 
INNER JOIN microposts m ON u.id=m.user_id 
INNER JOIN taggings t ON m.id=t.taggable_id 
INNER JOIN tags t2 ON t2.id=t.tag_id 
WHERE ARRAY(SELECT name FROM tags)::text[] @> ARRAY['hello'] 

Проблемная часть: WHERE ARRAY(SELECT name FROM tags)::text[]

Эта строка работает нормально, если я сравниваю ее с одиночное значение, например ARRAY['hello']

Но если это более одного значения, и мой ARRAY(SELECT name FROM tags)::text[] должен собирать тот же массив, что и ARRAY['hello', 'gday'], он не работает.

Мой оператор ARRAY(SELECT name FROM tags)::text[] создает правильный массив? если нет, то почему?

Для ясности вот моя структура данных

Микросообщения

╔════════════════╤════════════════════╤═══════════╗
║ id             │ user_id            │ content   ║
╠════════════════╪════════════════════╪═══════════╣
║ 1              │ 2                  │ "hi"      ║
╟────────────────┼────────────────────┼───────────╢
║ 2              │ 2                  │ "gday"    ║
╟────────────────┼────────────────────┼───────────╢
║ 3              │ 1                  │ "yo"      ║
╟────────────────┼────────────────────┼───────────╢
║ 4              │ 1                  │ "mate"    ║
╚════════════════╧════════════════════╧═══════════╝

Теги. ПРИМЕЧАНИЕ: taggable_id - это microposts.id

╔════════════════╤════════════════════╤═══════════╗
║ id             │ taggable_id        │ tag_id    ║
╠════════════════╪════════════════════╪═══════════╣
║ 1              │ 1                  │ 1         ║
╟────────────────┼────────────────────┼───────────╢
║ 2              │ 1                  │ 2         ║
╟────────────────┼────────────────────┼───────────╢
║ 3              │ 1                  │ 3         ║
╟────────────────┼────────────────────┼───────────╢
║ 4              │ 2                  │ 3         ║
╚════════════════╧════════════════════╧═══════════╝

Таблица тегов

╔════════════════╤════════════╗
║ id             │ name       ║
╠════════════════╪════════════╣
║ 1              │  "sport"   ║
╟────────────────┼────────────╢
║ 2              │  "cats"    ║
╟────────────────┼────────────╢
║ 3              │  "bird"    ║
╟────────────────┼────────────╢
║ 4              │  "diving"  ║
╚════════════════╧════════════╝

EDITTTT: Пример Ok

Ввод пользователя ARRAY['sport', 'cats', 'bird']

Таким образом, исходя из наших таблиц, это коррелирует, чтобы дать нам taggings.tag_id 1, 2, 3, и у каждого есть taggings.taggable_id 1, что соответствует микросообщению. Так что это именно то, что я ввожу.

1 Ответ

2 голосов
/ 11 апреля 2020

Если вы ищете микросообщений, которые имеют определенную коллекцию тегов, то вам нужна агрегация. С массивами вы можете использовать:

SELECT m.* 
FROM microposts m JOIN
     taggings tt
     ON m.id = tt.taggable_id JOIN
     tags t
     ON t.id = tt.tag_id 
GROUP BY m.id   -- allowed assuming id is either the primary key or unique
HAVING ARRAY_AGG(t.name ORDER BY t.name) @> ARRAY['hello'] ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...